火焰之舞 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 Converting circular structure to JSON
  • ¥30 Hyper-v虚拟机相关问题,求解答。
  • ¥15 TSM320F2808PZA芯片 Bootloader
  • ¥45 谷歌浏览器出现开发者工具无法显示已创建的,但您可以调试已部署的代码。 状态代码 404, net::ERR HTTP RESPONSE CODE FAILURE
  • ¥15 如何解决蓝牙通话音频突发失真问题
  • ¥15 安装opengauss数据库报错
  • ¥15 【急】在线问答CNC雕刻机的电子电路与编程
  • ¥60 在mc68335芯片上移植ucos ii 的成功工程文件
  • ¥15 笔记本外接显示器正常,但是笔记本屏幕黑屏
  • ¥15 Python pandas