关键词:
爬虫综合案例
开发步骤:
- 导入类库
- 创建爬虫通用类
- 初始化init方法
- 类中编写重试下载模块
- 类中编写真正下载模块
- 类外编写保存函数
- 类外编写获取robots.txt函数
- 类外编写抽取网址函数
- 类中编写网址正常化函数
- 创建下载限流类
- 爬虫通用类封装run方法
- 创建爬虫对象运行
导入类库
- requests:爬虫请求类库
- hashlib:哈希加密类库
- queue:队列
- re:正则
- time:时间
- threading>Thread:多线程
- datetime>datetime:日期时间
- urllib>parse>urlparse,urljoin,urldefrag:网址解析、拼接、截#取
- urllib>robotparser:robot.txt解析
- 目录名>文件名>MongoCache:存储到mongodb
创建爬虫通用类
功能:从初始网址爬取并抽取内层网址继续爬取
技术:随机User-Agent生成,队列,多线程,robots解析,下载限流,mongodb存储,爬取深度限制,重试下载,抽取特定路由,真正下载,网址正常化,功能封装
规范:用到类属性和类方法的方法在类里编写,用不到的在类外面编写,可以建个助手目录utils存放这些助手函数
初始化init方法
通常在开发过程中不可能一下子就把init写得完整,先把最易用到的,已经想到的初始化,后面的在编写其他函数想到时再来init里编写
- 生成UserAgent对象,随机生成headers
- 保存初始网址
- 创建队列并放入初始网址
使用不同的队列会造成BFS和DFS的效果 使用先进先出队列产生广度优先搜索,使用先进后出(栈)产生深度优先搜索
- 创建robots解析对象传入初始网址
- 设置指定路由
- 创建限流器对象并初始化间隔时间
- 创建mongodb存储对象
- 设置网址访问深度,在类外设置最大深度定量
类中编写重试下载模块
- 调用retry装饰器装饰该函数并设置最多重试次数
- 设置函数参数:网址,数据,请求方式,代理
- 编写POST和GET爬取方式
- 插入断言:状态码不为200则抛出异常
- 返回爬取结果content
text:返回的是unicode 型的数据,一般是在网页的header中定义的编码形式,如果想要提取文本就用text;
content:返回的是bytes,二级制型的数据;想要提取图片、文件,就要用到content;
.text是现成的字符串,.content还要编码,但是.text不是所有时候显示都正常,这是就需要用.content进行手动编码。
类中编写真正下载模块
将重试下载模块封装在此,不对用户展示重试下载接口
- 函数参数:网址,数据(默认None),请求方式(默认GET),代理(默认为空)
- 输出一句下载信息
- try~except 捕获重试下载模块的异常
- 返回结果
类外编写保存函数
保存函数:将爬取内容MD5加密存储到文件中,注:使用mongodb保存结果则无需次函数
- 创建md5加密对象
- 加密update结果
- 拼接保存文件路径
- 写入文件
类外编写获取robots.txt函数
- 创建robot文件解析对象
- 拼接robots.txt所在完整地址
- 获取robots.txt文件
- 将robot.txt文件读取到rp对象中
- 返回该解析对象
类外编写抽取网址函数
方式:lxml、BeautifulSoup、正则
lxml
1 html = lxml.html.fromstring(html_content) 2 html_data = html.xpath(‘//a/@href‘)
BeautifulSoup
1 soup = BeautifulSoup(‘lxml‘) 2 a_list = soup.find_all(‘a‘) 3 for a in a_list: 4 print(a[‘href‘])
正则
1 url_regex = re.compile(‘<a[^>]+href=["‘](.*?)["‘]‘, re.IGNORECASE) 2 return url_regex.findall(html_content.decode("utf-8"))
decode解码问题:不同网站所使用的编码方式有所不同—— utf-8 , gbk, gb2312, ISO-8859-1
类中编写网址正常化函数
实现一个类方法的时候,要注意类方法是否使用了当前类的属性或其他方法,如果未使用就说明和当前类没有直接关系,最好独立出来,当做工具方法
- 以网址中的#进行分割(urldefrag),提取出网址部分和#后的转发部分
- 将下载地址拼接上网址部分(urljoin)
1 urljoin:拼接网址,若参数2网址是正确格式,那么拼接的结果只是参数2网址,参数1网址忽略;若参数2网址是错误格式或是后缀path,那么和参数1网址进行拼接 2 urljoin(‘http://www.baidu.com‘,‘/ljb.html/index.html‘) 3 ‘http://www.baidu.com/ljb.html/index.html‘ 4 5 urljoin(‘http://www.baidu.com‘,‘http://ljb.html/index.html‘) 6 ‘http://ljb.html/index.html‘ 7 8 urljoin(‘/www.baidu.com‘,‘http://ljb.html/index.html‘) 9 ‘http://ljb.html/index.html‘ 10 11 urljoin(‘/test.html‘,‘http://ljb.html/index.html‘) 12 ‘http://ljb.html/index.html‘ 13 14 urljoin(‘http://www.baidu.com/test.html‘,‘http://ljb.html/index.html‘) 15 ‘http://ljb.html/index.html‘ 16 17 urljoin(‘http://www.baidu.com/test.html‘,‘http://www.sina.com/ljb.html/index.html‘) 18 ‘http://www.sina.com/ljb.html/index.html‘
创建下载限流类
限流:设置爬取的间隔时间是为了避免IP被封锁,随机间隔时间更可靠
初始化方法
- 创建domains字典,网址为键,访问时间为值
- 传参delay,自行设置两次下载间隔时间
间隔方法
-
原理:以delay作为时间间隔或超过delay才可进行访问(爬取)
-
第一次访问:获取不到网址对应的访问时间(不执行if-else语句),以网址地址为键,访问时间为值存入字典
-
第二次访问:获取上次访问对应网址的访问时间,进行if-else判断,计算时间差
-
注:若delay>(这次访问时间-上次访问时间),说明还没等够,还需要继续等待,还需等待的时间是——总等待时间delay减去已经等待的时间(就是当前时间减去本次访问的时间)
-
注:若delay<(这次访问时间-上次访问时间),说明已经等够了,可以直接访问
- 得到键(域名):urlparse().netloc
1 urlparse(‘http://www.baidu.com/index.html?x=123&y=789#13579‘) 2 ParseResult(scheme=‘http‘, netloc=‘www.baidu.com‘, path=‘/index.html‘, params=‘‘, query=‘x=123&y=789‘, fragment=‘13579‘)
- 从domains字典中get获取上次访问时间
- 通过ifelse计算还需等待的时间并睡眠(time.sleep) -一次访问后保存本次访问到domains字典中
爬虫通用类封装run方法
执行流程
- 判断队列中是否存在待爬取的网址
- 判断爬取网址是否遵守robots约定,不遵守则跳出禁止下载
- 对当前爬取网址限流
- 获取当前的访问深度
- 判断当前访问深度是否在规定范围内
- 下载爬取网址得到爬取结果
- 判断爬取结果是否为空
- 爬取结果不为空则保存
- 获取出爬取结果里的所有链接
- 使用过滤器筛选出指点关键字的链接
- for循环补全每个链接
- 补全同时判断链接是否访问过
- 未被访问过则深度加1
- 并加入队列
urllib爬虫(流程+案例)(代码片段)
网络爬虫是一种按照一定规则自动抓取万维网信息的程序。在如今网络发展,信息爆炸的时代,信息的处理变得尤为重要。而这之前就需要获取到数据。有关爬虫的概念可以到网上查看详细的说明,今天在这里介绍一下使用... 查看详情
小白爬虫综合项目1(代码片段)
项目1:搜狗知乎,爬取指定存储上一级目录的名字,以及存储爬取的页码#爬取前三页数据importrequestsimportosfile_name=input(‘请输入一个文件名:‘)#创建一个文件夹ifnotos.path.exists(f‘./file_name‘):os.mkdir(f‘./file_name‘)word=input(‘enterasearchw... 查看详情
django—综合案例(代码片段)
案例效果如下:打开/booktest/显示书籍列表点击新增,增加一条数据点击删除,删除一条数据点击查看,跳转英雄信息界面1.定义模型类打开booktest/models.py文件,定义模型类如下fromdjango.dbimportmodels#Createyourmodelshere.#定义书籍模型类... 查看详情
黑马前端pinkhtml综合案例:圣诞节的那些事小说排行榜案例注册页面(代码片段)
文章目录综合案例1:圣诞节的那些事目标代码综合案例2:小说排行榜案例目标代码综合案例3:注册页面目标代码综合案例1:圣诞节的那些事视频p30-31目标代码<!DOCTYPEhtml><htmllang="en"><head><... 查看详情
webapisdom-事件委托+综合案例(代码片段)
...数 / 事件基础 / 高阶函数 / 环境对象 / 综合案例-Tab栏切换 / DOM节点 /DOM时间对象/DOM重绘和回流/ DOM-事件对象/DOM-事件流目标:能够说出事件委托的好处一、事件委托是利用事件流的特征解决一些 查看详情
javaee框架技术之14ssm综合案例(代码片段)
SSM综合案例一、课程目标1.【掌握】SSM整合2.【√】学习Lombok使用3.【理解】Layui页面书写(备注:其他前端技术也可以)4.【理解】理解SSM综合案例表的结构5.【掌握】产品管理二、SSM整合Spring+SpringMVC+Mybatis–>SSMSpring+Struts2+Hiber... 查看详情
dom-节点对象+时间节点综合案例(代码片段)
...数 / 事件基础 / 高阶函数 / 环境对象 / 综合案例-Tab栏切换 / DOM节点 /DOM时间对象发布微博案例 需求11.注册input事件2.将文本的内容的长度赋值给对应的数值3.表单的maxlength属性可以直接限制在200个 查看详情
03ssm综合案例之16springsecurity(代码片段)
day03_SSM综合案例一、课程目标1.【理解】SpringSecurity权限框架2.【掌握】使用SpringSecurity进行用户登录3.【掌握】资源权限管理二、SpringSecurity2.1什么是SpringSecuritySpringSecurity的前身是AcegiSecurity,是Spring项目组中用来提供安全认... 查看详情
《python爬虫100例》复盘⑦,解决手机app爬虫环境问题(代码片段)
...;因为多数情况下捕捉到手机APP的接口,就已经解决了爬虫的最大问题。案例中使用的fiddler是4.0版本,整体的安装流程复盘了一下,无大问题。学习过程中重点注意的是[证书的安装],包括电脑证书,手机端证... 查看详情
8.爬虫训练场,第一个爬虫目标页设计,单页爬虫案例(代码片段)
单页爬虫配置案例相关文件第二个图片案例单页表格首页完善在初学爬虫采集时,很多人都是从一个单页采集需求开始的,单页案例也分为三种,分别如下:单篇新闻一些图片合集单页表格本篇博客就在爬虫训练... 查看详情
mysql例题一综合案例(多条件组合查询)(代码片段)
MySQL例题一综合案例多条件组合查询练习易错知识点/*NULL和空值-NULL也就是在字段中存储NULL值,空值也就是字段中存储空字符(’’)。selectlength(NULL),length(''),length('1'),length('2');+--------------+------------+- 查看详情
mysql例题一综合案例(多条件组合查询)(代码片段)
MySQL例题一综合案例多条件组合查询练习易错知识点/*NULL和空值-NULL也就是在字段中存储NULL值,空值也就是字段中存储空字符(’’)。selectlength(NULL),length(''),length('1'),length('2');+--------------+------------+- 查看详情
2021年最新最全flink系列教程__flink综合案例(代码片段)
day09_综合案例今日目标FlinkFileSink落地写入到HDFSFlinkSQL整合Hive数据仓库订单自动好评综合案例FlinkFileSink落地写入到HDFS常用的文件存储格式TextFilecsvrcFileparquetorcsequenceFile支持流批一体的写入到HDFSFileSink需求将流数据写入到HDFSpackage... 查看详情
爬虫入门第2课:代理池的设计(代码片段)
爬虫学习知识点及案例篇(汇总):爬虫入门第1课:代理池概述及开发环境本阶段带大家从代理池的设计开始,学习Python爬虫及项目实战,详情关注上方专栏↑↑↑1.代理池的工作流程目标:理解代理池的... 查看详情
c语言文件读写综合案例:读取lol信息(代码片段)
文章目录文件读写综合案例读写配置文件config.txt出现问题:解决中文乱码代码文件读写综合案例读写配置文件配置文件格式如下:正式的数据以‘:’冒号进行分割:冒号前为key起到索引作用冒号后为value是实值。#开头的... 查看详情
c语言文件读写综合案例:读取lol信息(代码片段)
文章目录文件读写综合案例读写配置文件config.txt出现问题:解决中文乱码代码文件读写综合案例读写配置文件配置文件格式如下:正式的数据以‘:’冒号进行分割:冒号前为key起到索引作用冒号后为value是实值。#开头的... 查看详情
爬虫案例(代码片段)
1、爬取肯德基的所有餐厅信息 kfc.com.cn/kfccda/storelist/index.aspx 肯德基官网--餐厅查询--输入查询关键字--点击查询 发现地址栏没有发生变化,说明发送的是ajax请求2、爬取国家药品监督管... 查看详情
用户授权控制数据库远程维护综合应用案例(代码片段)
案例1:授权数据库用户案例2:查看及撤销授权案例3:重置数据库管理密码案例4:远程维护数据库案例5:企业OA系统部署案例6:企业OA系统迁移1案例1:授权数据库用户1.1问题本例要求掌握MariaDB数据库中用户账号的授权操作,... 查看详情