爬虫实战——下载表情包之同/异步爬虫

 

1.同步爬虫

import re
import requests
from lxml import etree
from urllib import request
import os

def parse_url(url):
    headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36"}
    response=requests.get(url,headers=headers)
    text=response.text
    html=etree.HTML(text)
    imgs=html.xpath("//div[@class='page-content text-center']//img[@class!='gif']")
    for index,img in enumerate(imgs):
        img_url=img.get("data-original")
        alt=img.get("alt")
        alt=re.sub(r"\W","",alt)
        suffix=os.path.splitext(img_url)[-1]
        file_path="images/"+alt+str(index)+suffix
        print(file_path)
        # if not os.path.exists(file_path):
        #     os.mkdir(file_path)
        request.urlretrieve(img_url,file_path)#images/文件夹要提前创建,否则会报找不到路径错误


        #print(img_url)

def main():
    for i in range(1,50):
        url="https://www.doutula.com/photo/list/?page=%d"%i
        parse_url(url)
        break

if __name__=='__main__':
    main()

 

2.异步爬虫 多线程利用queue,快很多

import re
import requests
from lxml import etree
from urllib import request
import os
from queue import Queue
import threading

class Producer(threading.Thread):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36"}

    def __init__(self,urlqueque,imagequeue,*args,**kwargs):
        super(Producer,self).__init__(*args,**kwargs)
        self.urlqueue=urlqueque
        self.imagequeue=imagequeue

    def run(self):
        while True:
            if self.urlqueue.empty() :
                break

            url=self.urlqueue.get()
            self.parse_url(url)


    def parse_url(self,url):
        response=requests.get(url,headers=self.headers)
        text=response.text
        html=etree.HTML(text)
        imgs=html.xpath("//div[@class='page-content text-center']//img[@class!='gif']")
        for index,img in enumerate(imgs):
            img_url=img.get("data-original")
            alt=img.get("alt")
            alt=re.sub(r"\W","",alt)
            suffix=os.path.splitext(img_url)[-1]
            file_path="images/"+alt+str(index)+suffix
            #print(file_path)
            self.imagequeue.put((img_url,file_path))

class Costumer(threading.Thread):
    def __init__(self,urlqueque,imagequeue,*args,**kwargs):
        super(Costumer,self).__init__(*args,**kwargs)
        self.urlqueue=urlqueque
        self.imagequeue=imagequeue

    def run(self):
        while True:
            if self.imagequeue.empty() and self.urlqueue.empty():
                break
            img_url,file_path=self.imagequeue.get()
            request.urlretrieve(img_url,file_path)
            print(file_path+"已经下载完毕")



        #print(img_url)

def main():
    urlqueue=Queue(100)
    imagequeue=Queue(10000)
    for i in range(1,10):
        url="https://www.doutula.com/photo/list/?page=%d"%i
       # parse_url(url)
        urlqueue.put(url)
        #break
    for i in range(5):
        t=Producer(urlqueue,imagequeue)
        t.start()
    for i in range(5):
        t=Costumer(urlqueue,imagequeue)
        t.start()

if __name__=='__main__':
    main()

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值