火焰之舞 2022-04-29 12:58 采纳率: 100%
浏览 152
已结题

python爬虫怎么改成多线程

python爬虫怎么改成多线程

import parsel
import requests
import os


url = "****"

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                  'Chrome/100.0.4896.75 Safari/537.36 Edg/100.0.1185.39 '
}

response = requests.get(url=url, headers=headers)
html_str = response.text
selector = parsel.Selector(html_str)
lis = selector.xpath('//div[@id="primary"]/main/article')[1:]
for li in lis:
    pic_title = li.xpath('.//h2/a/text()').get()
    pic_url = li.xpath('.//h2/a/@href').get()
    print('正在下载相册:', pic_title)

    if not os.path.exists('img\\' + pic_title):
        os.mkdir('img\\' + pic_title)

    response_pic = requests.get(url=pic_url, headers=headers).text

    selector_2 = parsel.Selector(response_pic)
    pic_url_list = selector_2.xpath('//div[@class="entry-content"]//img/@src').getall()[1:-1]
    # print(pic_url_list)
    for pic_url in pic_url_list:
        img_data = requests.get(url=pic_url, headers=headers).content

        file_name = pic_url.split('/')[-1]
        with open(f'img\\{pic_title}\\{file_name}', mode='wb') as f:
            f.write(img_data)
            print('保存完成:', file_name)
  • 写回答

6条回答 默认 最新

  • bj_0163_bj 2022-04-29 20:27
    关注

    楼上的这些线程改造方式放在这里行不通吧。楼主代码中IO操作在循环的地方,这里线程不是应该将循环改成多线程吗。。。
    ##改了一个循环,试一下

    
    ```python
    
    import parsel
    import requests
    import os
    from multiprocessing.dummy import Pool
     
     
    url = "****"
     
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/100.0.4896.75 Safari/537.36 Edg/100.0.1185.39 '
    }
     
    response = requests.get(url=url, headers=headers)
    html_str = response.text
    selector = parsel.Selector(html_str)
    lis = selector.xpath('//div[@id="primary"]/main/article')[1:]
    for li in lis:
        pic_title = li.xpath('.//h2/a/text()').get()
        pic_url = li.xpath('.//h2/a/@href').get()
        print('正在下载相册:', pic_title)
     
        if not os.path.exists('img\\' + pic_title):
            os.mkdir('img\\' + pic_title)
     
        response_pic = requests.get(url=pic_url, headers=headers).text
     
        selector_2 = parsel.Selector(response_pic)
        pic_url_list = selector_2.xpath('//div[@class="entry-content"]//img/@src').getall()[1:-1]
        # print(pic_url_list)
        def saveimg(pic_url):
            img_data = requests.get(url=pic_url, headers=headers).content
            file_name = pic_url.split('/')[-1]
            with open(f'img\\{pic_title}\\{file_name}', mode='wb') as f:
                f.write(img_data)
                print('保存完成:', file_name)
       
        p = Pool(10)
        result=p.map(saveimg,pic_url_list)
        p.close()
        p.join()
    
    

    ```

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 5月7日
  • 已采纳回答 4月29日
  • 创建了问题 4月29日

悬赏问题

  • ¥15 对于这个复杂问题的解释说明
  • ¥50 三种调度算法报错 采用的你的方案
  • ¥15 关于#python#的问题,请各位专家解答!
  • ¥200 询问:python实现大地主题正反算的程序设计,有偿
  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败