100行代码教你爬取斗图网(Python多线程队列)
100行代码教你爬取斗图网(Python多线程队列)
前言
根据之前写的两篇文章,想必大家对多线程和队列有了一个初步的了解,今天这篇文章就来实战一下,用多线程 + 队列 爬取斗图网的全网图片。
你还在为斗图找图片而烦恼吗?快来跟我一起 happy 吧!
PS:本文目的是抱以学习心态而分享,禁止用于非法以及商业途径,如有风险,一切后果自己承担!
成果演示
先来看看最后的成果:
启动程序后,可以发现目录下是同时出现 5 个主题图片(线程设置了 5 个,所以同时创建 5 个文件夹)的,每个主题文件夹下都有相应的图片。
确认需求
开始之前,先来看下要爬取的网站以及图片,对其进一步进行分析。
- 要爬取的网站 - 斗图啦
- 要爬取的内容,肯定就是图片啦
每个主题的详细图片:
从斗图啦主页点到详情页可以看到,每个主题下有好多图片,所以需求就是爬取 1 - 615 页每页中详情页的图片。
html 节点分析
首先,在斗图啦首页列表中一共有 615 页,每次点击不同页时,可以观察到地址的变化:
不难发现,点击第几页时,网页地址后面的 page 就是几。
分析好网站的分页后,可以按照正常流程的逻辑进行 HTML 源码的分析,打开 F12 ,让我们来一步步进行梳理。
1. 分析每页的主题 url 地址
比如第一页中,要爬取其下的所有主题,而每个主题下又有具体的详情图片。所以第一步需要分析点击每个主题后的 url 地址。如下图:
这样一来,确定了第一页中,所有主题的具体详情页地址:
2. 分析每个主题下详情页的各个图片地址
用第一个企鹅表情举例,当我们点入到此主题后,F12继续分析每个图片的具体地址:
再次分析,可以发现,所有图片其实结构都一样,只需要提取下图的图片地址即可完成:
3. 思维导图爬取思路
代码设计思路
上面分析完,接下来讲下笔者的设计思路,代码不唯一,爬取的思路提供给大家了,也可自行先写一个玩玩看,然后在对比咱们写的代码有什么不同处。。
部分代码讲解
来简单的看部分代码:
def main():print('程序开始!')thread_nums = 5 # 开启 5 个线程for main_url in range(1, 615):url = f'https://www.doutula.com/article/list/?page={main_url}'DouTuLaSpider.url_queue.put(url)doutu = DouTuLaSpider()# 开启多线程for i in range(thread_nums):thread = threading.Thread(target=doutu.run)thread.start()thread.join()print('程序结束...')
def run(self):""" 通过队列来实现多线程的有序性,从第 1 页到第 614 页有序处理 """try:while 1:url_queue = DouTuLaSpider.url_queueif url_queue.qsize() == 0:breakelse:main_url = url_queue.get()html = self.__crawl_html(main_url)self.__control_speed() # 加延时self.__analysis_main_url(html) # 分析主节点except Exception as e:import tracebacktraceback.print_exc()
入口地方,开启 5 个线程,分别将所有页数的地址放入队列中,然后让线程去队列中有序的获取分页的地址。
如果有细看代码的同学,会发现上面的代码是 1-614 页,因为代码是前天写的,那会儿还只有 614 ,斗图啦网站每日都有更新哟。。
简单的说下为什么要用队列?就是因为有序,多线程下,如果不引用队列的话,有可能会出现爬取重复的url地址呀。。。不理解的话想想这个问题:你怎么知道哪个是你爬取过的的地址呢?
其余的具体提取操作代码就不放了。
当然,我们是为了学习,而不是为了攻击人家服务器。。。爬取的时候该控制速度就要控制速度,在源码中已经对应提供了。而笔者这里作为演示,也没有全爬取,就是爬取了一小部分而已。
总结
如果有想要全部代码的同学,老规矩,公众号后台回复 斗图啦,完整代码已经放到了 github 上了。
关于多线程和队列不理解的同学,欢迎看下之前写的两篇文章。如果有哪里不懂的,欢迎留言区留言交流。期待你的留言呐!
欢迎关注:migezatan.(咪哥杂谈)
100行代码教你爬取斗图网(Python多线程队列)相关推荐
- 爬虫笔记——多线程爬取斗图网表情包(threading)
爬虫笔记--多线程爬取斗图网表情包(threading) 网站观察 爬取框架 具体代码 斗图网网址:斗图网,这里以爬取最新套图为例. 网站观察 在网页翻页操作中可以看到网页是非动态加载的(page为页 ...
- 使用python爬取斗图网的图片
使用python爬取斗图网的图片 以下是代码部分: # -*- coding: utf-8 -*- """ Created on Wed Apr 14 14:41:42 ...
- 斗图斗不过小伙伴?python多线程爬取斗图网表情包,助你成为斗图帝!
最近python基础课讲到了多线程,老师让交个多线程的实例练习.于是来试试多线程爬虫,正好复习一下mooc上自学的嵩天男神的爬虫知识.想法很美好,过程却很心酸,从早上开始写,每次出现各种奇怪问题,到现 ...
- python3爬虫——多线程爬取斗图网表情包
本文用多线程生产者,消费者模式爬取斗图网的表情包,并下载保存到本地,get_page()函数负责获取页面的图片的url链接,downlod_img()函数通过图片url下载保存到本地文件夹中,开启多线 ...
- 爬取斗图网图片,使用xpath格式来匹配内容,对请求伪装成浏览器, Referer 防跨域请求...
6.21自我总结 一.爬取斗图网 1.摘要 使用xpath匹配规则查找对应信息文件将请求伪装成浏览器Referer 防跨域请求 2.爬取代码 #导入模块 import requests#爬取网址 ur ...
- 手把手教学php表情包,手把手教你爬取斗图啦表情包
爬取表情包 闲来无事,突然想到表情包好久没有更新了,正好这几天学了爬虫,利用爬虫来更新一波表情包,哈哈哈. 有一个网站,叫做"斗图啦",网址是:https://www.doutul ...
- 爬取斗图网表情包之后斗图会输?不存在的
前言: 本文非常浅显易懂,可以说是零基础也可快速掌握.如有疑问,欢迎留言,笔者会第一时间回复. 一.分析表情包网址 1.进入斗图啦网址,点击**"最新表情"**,再点击第二.第三页 ...
- 23行代码带你爬取美女图
爬取妹子图可能在爬虫里面没有什么技术含量了,新手练练手还是可以的. 今天爬取的网址是:http://www.youzi4.cc/mm/meinv/index_1.html 注意:爬取图片一般要加上re ...
- 多线程爬取斗图网表情包
import requests import re import queue import threading import timeHeaders = {'User-Agent': 'Mozilla ...
最新文章
- jsp判断disable按钮不可选_选电子琴五部曲
- docker从入门到实践第三版pdf_测开日常积累--Docker入门到实践
- java基础教程知识点,[Java教程]js基础知识点总结
- 总结-linux初识进程(包括cpu调度、进程创建、僵尸进程(重点)、环境变量)
- mysql 动态创建事件_mysql 通过事件定时为数据库创建动态表名
- java 运行时修改类_在运行时修改类定义的注释字符串参数
- 瑞士表商 Swatch 关闭 IT 系统,阻止网络攻击
- 给图片添加水印效果图的函数(可以在图片上添加自己的版权和LOGO图片的水印) 【转载】...
- 解决办法:RuntimeWarning: numpy.dtype size changed, may indicate binary incompatibility. Expected 96
- IDEA+Java控制台实现教材管理系统
- GWR(地理加权回归)预测分析中国各省份开关窗情况(R语言)
- TCP/IP 报文格式(IP数据包、TCP报头、UDP报头)
- 神舟笔记本电脑进入u启动之BIOS设置方法
- 网线制作ppt_制作网线图解讲解.ppt
- codesys 简单案例_CoDeSys编程手册范本
- 我是SPI,我让框架更加优雅了!
- 常见随机变量的数学期望和方差
- 小程序支付:appid和mch_id不匹配采坑实录
- 华为鸿蒙,希望是务实的操作系统
- Mac air装 win10 ,总是提示拷贝windows安装文件失败!?