返回顶部
首页 > 资讯 > 后端开发 > Python >爬虫——综合案例流程版
  • 280
分享到

爬虫——综合案例流程版

爬虫流程案例 2023-01-30 22:01:14 280人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

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

开发步骤:

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

--结束END--

本文标题: 爬虫——综合案例流程版

本文链接: https://lsjlt.com/news/179730.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 爬虫——综合案例流程版
    开发步骤: 导入类库 创建爬虫通用类 初始化init方法 类中编写重试下载模块 类中编写真正下载模块 类外编写保存函数 类外编写获取robots.txt函数 类外编写抽取网址函数 类中编写网址正常化函数 创建下载限流类 爬虫通用类封装...
    99+
    2023-01-30
    爬虫 流程 案例
  • 黑马程序员最新版JavaWeb综合案例(前后端完整版)
    JavaWeb 综合案例 学习视频链接: 黑马程序员最新版JavaWeb基础教程,Java web从入门到企业实战完整版 完整代码链接: https://github.com/HaiLei-Fly/JavaWeb-brand 1、功能介绍 ...
    99+
    2023-08-16
    mybatis maven java intellij-idea mysql
  • Java多线程编程综合案例详解
    目录Java多线程综合案例数字加减生产电脑竞争抢答Java多线程综合案例 数字加减 设计4个线程对象,两个线程执行减操作,两个线程执行加操作 public class ThreadD...
    99+
    2024-04-02
  • JavaWeb开发 —— SpringBootWeb综合案例
    通过综合案例,我们来了解和学习在开发Web程序时,前端程序和后端程序以及数据库三者之间是如何交互、如何协作的,而通过综合案例也来掌握通过接口文档开发服务端接口的能力。 目录 一、准备工作 1. 需求说明 2. 环境搭建 3. 开发规范 二、...
    99+
    2023-09-26
    mybatis java mysql
  • Python爬虫案例分析
    本篇内容介绍了“Python爬虫案例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 一、论述这几个案例以前是给一些想进入Pyt...
    99+
    2023-06-17
  • 爬虫逆向抖音新版signature分析案例
    目录断点调试流程分析流程总结因为老策略一直能用,一直没有看新版signature。本文做一下分析记录。 断点调试 堆栈进来之后,url中signature已经有了 shift+f1...
    99+
    2024-04-02
  • Python Ajax爬虫案例分享
    目录1. 抓取街拍图片2. 分析街拍图片结构3. 按功能不同编写不同方法组织代码3.1 获取网页json格式数据3.2 从json格式数据提取街拍图片3.3 将街拍图片以其md5码命...
    99+
    2024-04-02
  • JavaScript DOM API的使用教程及综合案例
    目录一. 什么是DOM二. 最常用的DOM API1. 选中页面元素2. 操作元素的属性2.1 事件概念2.2 获取/修改元素内容2.4 获取/修改元素属性2.5 获取/修改表单元素...
    99+
    2023-03-19
    js dom api使用 js dom操作方法 dom常用api
  • 【Servlet+JDBC+HTML+MySQL+】------查询综合案例
    分享第二十四篇励志语句 对自己狠一点,逼自己努力,再过五年你将会感谢今天发狠的自己,恨透今天懒惰自卑的自己,既然认准了一条路,那就坚持走下去,命运不会辜负每一个认真而努力的人。   目录 分享第二十四篇励志语句 1 案例需求 2 创...
    99+
    2023-08-31
    java 开发语言
  • 【javaWeb+tomcat+MySQL】综合案例-完整步骤
    目录 一、前提 二、创建一个普通的java项目 三、添加Web Application 四、添加tomcat 五、测试tomcat是否连接成功  六、在src目录下创建四个package 七、在WEB-INF下创建文件夹lib,导入两个ja...
    99+
    2023-09-03
    intellij-idea java ide
  • Python爬虫之Scrapy环境搭建案例教程
    Python爬虫之Scrapy环境搭建 如何搭建Scrapy环境 首先要安装Python环境,Python环境搭建见:https://blog.csdn.net/alice_tl/a...
    99+
    2024-04-02
  • node.js做一个简单的爬虫案例教程
    准备工作 首先,你需要下载 nodejs,这个应该没啥问题吧 原文要求下载 webstrom,我电脑上本来就有,但其实不用下载,完全在命令行里面操作就行 创建工程...
    99+
    2024-04-02
  • Python Ajax爬虫方法案例分析
    今天小编给大家分享一下Python Ajax爬虫方法案例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 抓...
    99+
    2023-06-29
  • Python网络爬虫实战案例之:7000
    一、前言 本文是《Python开发实战案例之网络爬虫》的第三部分:7000本电子书下载网络爬虫开发实战详解。配套视频课程详见51CTO学院请添加链接描述。 二、章节目录 3.1 业务流程3.2 页面结构分析:目录页3.3 页面结构分析:详情...
    99+
    2023-01-31
    爬虫 实战 案例
  • python网络爬虫的流程步骤
    本文将为大家详细介绍“python网络爬虫的流程步骤”,内容步骤清晰详细,细节处理妥当,而小编每天都会更新不同的知识点,希望这篇“python网络爬虫的流程步骤”能够给你意想不到的收获,请大家跟着小编的思路慢慢深入,具体内容如下,一起去收获...
    99+
    2023-06-08
  • Python爬虫采集Tripadvisor数据案例实现
    目录前言第三方库开发环境开始代码请求数据2. 获取数据(网页源代码)3. 解析数据(提取我们想要的数据内容 详情页链接)4. 发送请求(访问所有的详情页链接) 获取数据5. 解析数据...
    99+
    2024-04-02
  • 分享Python7个爬虫小案例(附源码)
            本次的7个python爬虫小案例涉及到了re正则、xpath、beautiful soup、selenium等知识点,非常适合刚入门python爬虫的小伙伴参考学习。注:若涉及到版权或隐私问题,请及时联系我删除即可。 1....
    99+
    2023-08-31
    python 爬虫 数据分析
  • 01_爬虫的基本概念和流程
    为什么我们要学习爬虫?学习爬虫有什么意义? 进行数据分析,可以爬取网站上面的数据,来进行数据分析 我们现在身处大数据时代,大数据的数据是怎么来的? 爬虫来获取(方法之一) 比如微博的微指数可以看热词的趋势 从官方下载 利用爬虫...
    99+
    2023-01-31
    爬虫 基本概念 流程
  • Python爬虫入门案例之爬取二手房源数据
    本文重点 系统分析网页性质 结构化的数据解析 csv数据保存 环境介绍 python 3.8 pycharm 专业版 >>&...
    99+
    2024-04-02
  • python爬虫系列网络请求案例详解
    目录urllib的介绍urllib库的四大模块:案例发送请求参数说明:代码案例发送请求-Request请求IP代理IP代理分类:使用cookie使用步骤:异常处理学习了之前的基础和爬...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作