php多线程抓取多个网页(这段代码使用一个多处理来正确地从工作函数返回值)

优采云 发布时间: 2021-10-04 04:24

  php多线程抓取多个网页(这段代码使用一个多处理来正确地从工作函数返回值)

  部分

  我想从服务器渲染的网页中获取链接,所以我需要使用 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)

  这段代码使用了一个多处理管理器来正确地从工作函数返回值,它似乎不再引发错误,至少对我来说是这样。希望对你有帮助,有任何问题,请务必在下方评论。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线