我的编程空间,编程开发者的网络收藏夹
学习永远不晚

爬虫——综合案例流程版

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

爬虫——综合案例流程版

开发步骤:

  • 导入类库
  • 创建爬虫通用类
  • 初始化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
  • 并加入队列

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

爬虫——综合案例流程版

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

爬虫——综合案例流程版

开发步骤:导入类库创建爬虫通用类初始化init方法类中编写重试下载模块类中编写真正下载模块类外编写保存函数类外编写获取robots.txt函数类外编写抽取网址函数类中编写网址正常化函数创建下载限流类爬虫通用类封装run方法创建爬虫对象运行导
2023-01-30

黑马程序员最新版JavaWeb综合案例(前后端完整版)

JavaWeb 综合案例 学习视频链接: 黑马程序员最新版JavaWeb基础教程,Java web从入门到企业实战完整版 完整代码链接: https://github.com/HaiLei-Fly/JavaWeb-brand 1、功能介绍
2023-08-16

JavaScript DOM API的使用教程及综合案例

dom是DocumentObjectModel的缩写,即文档对象模型,是基于文档编程的一套API接口,下面这篇文章主要给大家介绍了关于JavaScript DOM API的使用教程及综合案例的相关资料,需要的朋友可以参考下
2023-03-19

2023年下半年网络工程师真题答案解析(综合+案例)

2023下半年软考网络工程师真题答案解析已更新。本文带来的是2023下半年软考网络工程师真题及答案解析汇总,以便2023下半年网络工程师考生估分。

2024年上半年网络工程师真题答案解析(综合+案例)

2024上半年软考网络工程师真题答案解析已更新。本文带来的是2024上半年软考网络工程师真题及答案解析汇总,以便2024上半年网络工程师考生估分。

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录