鱼C论坛

 找回密码
 立即注册
查看: 9016|回复: 36

[技术交流] 为避免尬聊,我用Python爬取了一千多张斗图!

[复制链接]
发表于 2021-9-11 20:59:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本次爬虫所需要的工具库我先列举出来
import requests
from lxml import etree
import threading
from queue import Queue
import re
缺少哪些就自行安装。

抓取目标
本次实战所要抓取的网站是斗图吧。网址如下:

https://www.doutub.com/

定睛一看,好家伙,居然有26页的表情包,这不起飞?

首先来分析一下不同页面url的地址变化。

# 第一页
https://www.doutub.com/img_lists/new/1

# 第二页
https://www.doutub.com/img_lists/new/2

# 第三页
https://www.doutub.com/img_lists/new/3
看到这种变化的方式之后难道你不先窃喜一下。

页面url地址已经搞定,那接下来要弄清楚的就是每一张表情包的url地址了。

这不是很容易就被聪明的你发现了吗?这些链接我们采用xpath将其提取出来即可。

生产者的实现
首先,我们先创建两个队列,一个用于存储每一页的url地址,另一个便用于存储图片链接。

具体代码,如下所示:
page_queue = Queue()    # 页面url
img_queue = Queue()     # 图片url
for page in range(1, 27):
    url = f'https://www.doutub.com/img_lists/new/{page}'
    page_queue.put(url)

通过上面的代码,便将每一页的url地址放入了page_queue。

接下来再通过创建一个类,将图片url放入img_queue中。

具体代码如下所示:

class ImageParse(threading.Thread):
    def __init__(self, page_queue, img_queue):
        super(ImageParse, self).__init__()
        self.page_queue = page_queue
        self.img_queue = img_queue
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36'
        }

    def run(self):
        while True:
            if self.page_queue.empty():
                break
            url = self.page_queue.get()
            self.parse_img(url)

    def parse_img(self, url):
        response = requests.get(url, headers=self.headers).content.decode('utf-8')
        html = etree.HTML(response)
        img_lists = html.xpath('//div[@class="expression-list clearfix"]')
        for img_list in img_lists:
            img_urls = img_list.xpath('./div/a/img/@src')
            img_names = img_list.xpath('./div/a/span/text()')
            for img_url, img_name in zip(img_urls, img_names):
                self.img_queue.put((img_url, img_name))
消费者的实现
其实消费者很简单,我们只需要不断的从img_page中获取到图片的url链接并不停的进行访问即可。直到两个队列中有一个队列为空即可退出。

class DownLoad(threading.Thread):
    def __init__(self, page_queue, img_queue):
        super(DownLoad, self).__init__()
        self.page_queue = page_queue
        self.img_queue = img_queue
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36'
        }

    def run(self):
        while True:
            if self.page_queue.empty() and self.img_queue.empty():
                break
            img_url, filename = self.img_queue.get()
            fix = img_url.split('.')[-1]
            name = re.sub(r'[??.,。!!*\\/|]', '', filename)
            # print(fix)
            data = requests.get(img_url, headers=self.headers).content
            print('正在下载' + filename)
            with open('../image/' + name + '.' + fix, 'wb') as f:
                f.write(data)
最后,再让创建好的两个线程跑起来
for x in range(5):
    t1 = ImageParse(page_queue, img_queue)
    t1.start()
    t2 = DownLoad(page_queue, img_queue)
    t2.start()
    t1.join()
    t2.join()
最后结果

一共抓取了1269张图片。

从今往后谁还能比得上你?就这?这不有爬虫就行!
完整代码回复可见
游客,如果您要查看本帖隐藏内容请回复

[/hide]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-17 21:23:07 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-18 07:34:29 From FishC Mobile | 显示全部楼层
老铁就能
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-18 12:29:28 | 显示全部楼层
学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-18 15:56:40 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-18 19:00:03 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2021-10-18 19:37:04 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-18 20:54:50 | 显示全部楼层
学习学习!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-22 20:07:40 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-1 19:26:54 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-1 19:56:49 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-1 20:16:14 | 显示全部楼层
让我瞧瞧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-2 11:48:17 | 显示全部楼层
瞧瞧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-27 22:03:58 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-28 10:03:34 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-28 10:15:33 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-28 17:49:17 From FishC Mobile | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-28 18:34:55 | 显示全部楼层
学习中,请指教
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-28 21:43:10 | 显示全部楼层
学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-30 09:21:48 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-14 07:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表