python - input() 函数的存在会导致多处理失败。这背后的原因是什么?
问题描述
我有一个使用多处理的简单网络抓取脚本。我希望用户选择要抓取的 excel 文件,所以input()
在开始时使用。
如果没有多处理代码,脚本运行良好(尽管它一次处理一个链接)。使用多处理代码,脚本会无限期地挂起。即使我不使用从input()
脚本中收集的字符串也是如此,因此似乎正是这种情况的存在input()
导致脚本因多处理而挂起。
我不知道为什么会这样。任何见解都非常感谢。
编码:
os.chdir(os.path.curdir)
# excel_file_name_b is not used in the script at all, but because
# it exists, the script hangs. Ideally I want to keep input() in the script
excel_file_name_b = input()
excel_file_name = "URLs.xlsx"
excel_file = openpyxl.load_workbook(excel_file_name)
active_sheet = excel_file.active
rows = active_sheet.max_row
for i in range(2,rows+1,1):
list.append(active_sheet.cell(row=i,column=1).value)
headers = {"User-Agent":'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36',"Accept-Language": 'en-GB'}
def scrape(url):
try:
res = get(url, headers = headers)
html_soup = BeautifulSoup(res.text, 'lxml')
html_element = html_soup.select('._3pvwV0k')
return res.url, html_element[0].getText()
except:
return res.url, "Not found or error"
pass
if __name__ == '__main__':
p = Pool(10)
scrape_return = p.map(scrape, list)
for k in range(len(scrape_return)):
try:
active_sheet.cell(row=k+2, column=2).value = scrape_return[k][0]
active_sheet.cell(row=k+2, column=3).value = scrape_return[k][1]
except:
continue
excel_file.save(excel_file_name)
解决方案
因为您input()
处于模块级别,所以每个进程都在调用它以使其可供进程使用。
多处理关闭标准输入,这是导致每个错误的原因。[文档]
如果你把它移到if __name__ == '__main__':
你应该不再有问题了。
编辑:重新格式化您的代码更类似于下面可能会清除它没有按预期执行的其他问题。
def scrape(url):
headers = {"User-Agent":'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36',"Accept-Language": 'en-GB'}
try:
res = get(url, headers=headers)
html_soup = BeautifulSoup(res.text, 'lxml')
html_element = html_soup.select('._3pvwV0k')
return res.url, html_element[0].getText()
except:
return res.url, "Not found or error"
pass
def main():
excel_file_name_b = input()
excel_file_name = "URLs.xlsx"
excel_file = openpyxl.load_workbook(excel_file_name)
active_sheet = excel_file.active
rows = active_sheet.max_row
for i in range(2,rows+1,1):
list.append(active_sheet.cell(row=i,column=1).value) # rename this object, list is a keyword
p = Pool(10)
scrape_return = p.map(scrape, list) # rename here too
for k in range(len(scrape_return)):
try:
active_sheet.cell(row=k+2, column=2).value = scrape_return[k][0]
active_sheet.cell(row=k+2, column=3).value = scrape_return[k][1]
except:
continue
excel_file.save(excel_file_name)
if __name__ == '__main__':
main()
推荐阅读
- sql - 查找两次之间放置的订单给出零结果
- heroku - 如何登录heroku
- mysql - 带有原始数据库查询的 Laravel 8 收集过滤器
- javascript - 将 2d json(?) 数组转换为 pandas 数据框
- html - 如何强制 img 元素采用其父元素的宽度和高度?
- javascript - 如何仅在用户在 React.js 中查看时播放短视频
- html - Bootstrap 5卡平铺位置添加冲突
- github-actions - 在 Github 手动操作中,无法获取所选分支
- azure-ad-b2c - Azure B2C - 更改登录 - 令牌返回旧电子邮件地址
- java - Kotlin 任何类型到 Java 对象类型