php多线程抓取多个网页(这段代码使用一个多处理来正确地从工作函数返回值)
优采云 发布时间: 2021-10-04 04:24php多线程抓取多个网页(这段代码使用一个多处理来正确地从工作函数返回值)
部分
我想从服务器渲染的网页中获取链接,所以我需要使用 requests_html 并渲染网页以从中提取链接。
现在假设我想要10个网页中的10个链接,它一个一个地工作,首先渲染网页,然后提取链接,这很耗时
我想要做的是通过同时使用多处理/线程运行函数的不同实例来提取所有链接
所以我尝试了以下方法:
download_links = []
def getDownloadLinks(url):
session = HTMLSession()
page = session.get(url)
page.html.render(timeout=0)
link = page.find('#zmovie-view', first=True).find('video', first=True).attrs['src']
download_links.append(link)
links = ['https://animehd47.com/jujutsu-kaisen-tv/s2-m1/', 'https://animehd47.com/jujutsu-kaisen-tv/s2-m2/', 'https://animehd47.com/jujutsu-kaisen-tv/s2-m3/', 'https://animehd47.com/jujutsu-kaisen-tv/s2-m4/', 'https://animehd47.com/jujutsu-kaisen-tv/s2-m5/', 'https://animehd47.com/jujutsu-kaisen-tv/s2-m6/', 'https://animehd47.com/jujutsu-kaisen-tv/s2-m7/', 'https://animehd47.com/jujutsu-kaisen-tv/s2-m8/', 'https://animehd47.com/jujutsu-kaisen-tv/s2-m9/', 'https://animehd47.com/jujutsu-kaisen-tv/s2-m10/']
threads = []
for i in range(len(links)):
process = multiprocessing.Process(target=getDownloadLinks, args=(links[i],))
process.start()
threads.append(process)
for t in threads:
t.join()
但它什么都不返回,而是引发了多个错误。我抬头看了看谷歌,我得到的是它与asyncio有关,它永远无法成功完成其循环迭代。
问题是什么?
CmdCoder858
从我的测试来看,这段代码似乎是您问题的最佳解决方案:
import multiprocessing
from requests_html import HTMLSession
def getDownloadLinks(url, returnvar, i):
try:
session = HTMLSession()
page = session.get(url)
page.html.render(timeout=0)
link = page.html.find('#zmovie-view', first=True).find('video', first=True).attrs['src']
returnvar[str(i)] = link
page.close()
session.close()
except Exception as e:
print(e)
links = ['https://animehd47.com/jujutsu-kaisen-tv/s2-m1/', 'https://animehd47.com/jujutsu-kaisen-tv/s2-m2/',
'https://animehd47.com/jujutsu-kaisen-tv/s2-m3/', 'https://animehd47.com/jujutsu-kaisen-tv/s2-m4/',
'https://animehd47.com/jujutsu-kaisen-tv/s2-m5/', 'https://animehd47.com/jujutsu-kaisen-tv/s2-m6/',
'https://animehd47.com/jujutsu-kaisen-tv/s2-m7/', 'https://animehd47.com/jujutsu-kaisen-tv/s2-m8/',
'https://animehd47.com/jujutsu-kaisen-tv/s2-m9/', 'https://animehd47.com/jujutsu-kaisen-tv/s2-m10/']
if __name__ == '__main__':
threads = []
manager = multiprocessing.Manager()
returndict = manager.dict()
for i in range(len(links)):
try:
process = multiprocessing.Process(target=getDownloadLinks, args=(links[i], returndict, i))
process.start()
threads.append(process)
except Exception as e:
print(e)
for t in threads:
t.join()
print(returndict)
这段代码使用了一个多处理管理器来正确地从工作函数返回值,它似乎不再引发错误,至少对我来说是这样。希望对你有帮助,有任何问题,请务必在下方评论。