网络是静态的,而爬虫是动态的,所以爬虫的基本思想就是沿着网页上的链接(蜘蛛网的节点)爬取有效信息。 当然,网页也是动态的(一般是用PHP或者ASP编写的,比如用户登录界面就是动态网页),但是如果蜘蛛网摇摇欲坠,蜘蛛就会感觉不太稳定,所以优先考虑动态网页通常会通过搜索引擎进行排名。 静态网页的背后。
现在你已经了解了爬虫的基本思想,那么具体如何操作呢? 这要从网页的基本概念开始。 网页由三个主要组成部分,即 html 文件、css 文件和 Javascript 文件。 如果把网页看成一座房子,那么HTML就相当于房子的外壳; CSS相当于地砖漆,美化房屋的外观和内部; Javascript相当于家具、电器、浴室等,给房子增加功能。 从上面的比喻我们可以看出,HTML是网页的基础。 毕竟市场上也有地砖涂料,家具电器可以露天展示,房子的外壳也独一无二。
这是一个简单网页的示例:
在爬虫眼中,这个网页是这样的:
因此,网页本质上是超文本,网页上的所有内容都在“...”形式的标签内。 如果我们想要收集网页上的所有超链接,只需要在所有标签中查找以“href=”开头的字符串,并检查提取的字符串是否以“http”开头(超文本转换协议,https表示安全http协议) )。 如果超链接不是以“http”开头,则该链接很可能是网页所在的本地文件或 ftp 或 smtp(文件或邮件传输协议),应将其过滤掉。
在Python中,我们利用Requests库中的方法来帮助我们实现对网页的请求,从而实现实现爬虫的过程。
1.2 Requests库的7个主要方法:
最常用的方法get用于实现一个简单的爬虫,示例代码如下:
2. 机器人协议
Robots协议(又称爬虫协议、机器人协议等)全称是“Robots Exclusion Protocol”。 网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。 我们用几个小例子来解读一下robots.txt的内容。 Robots.txt默认放置在网站根目录下。 对于没有robots.txt文件的网站,默认允许所有爬虫获取其网站内容。
我们对机器人协议的理解是,如果是为了商业利益,必须遵守机器人协议的内容,否则我们将承担相应的法律责任。 当你只是玩弄网页、练习的时候,建议遵循一下,提高自己写爬虫的友好度。
3. 网页分析
BeautifulSoup试图化平凡为神奇,通过定位HTML标签来格式化和组织复杂的网络信息,并使用简单易用的Python对象为我们展示XML结构信息。
BeautifulSoup 是一个用于解析、遍历和维护“标签树”的函数库。
3.1 BeautifulSoup解析器
BeautifulSoup使用上述四个解析器来解析我们获取到的网页内容。 我们用官网的例子看一下解析结果:
首先获取上面的HTML内容,通过BeautifulSoup进行解析,输出解析结果进行对比:
通过解析网页内容,我们可以使用BeautifulSoup中的方法轻松获取网页中的主要信息:
3.2 BeautifulSoup类的基本元素
3.3 BeautifulSoup的遍历函数
遍历分为三种:升序遍历、降序遍历、并行遍历。
4.正则表达式
正则表达式,也称为正则表达式。 (英文:正则表达式,在代码中常缩写为regex、regexp或RE),计算机科学中的一个概念。 常规表通常用于检索和替换与特定模式(规则)匹配的文本。
笔者也是正则表达式的初学者,感觉无法简洁清晰的描述正则表达式。 建议你参考网上教程(#mission),里面有图文并茂详细解释了正则表达式。
掌握正则表示还可以帮助我们获取网页中的主要信息。
5. Scrapy,爬虫框架
Scrapy 是一个用 Python 开发的快速、高级屏幕抓取和网页抓取框架,用于抓取网站并从页面中提取结构化数据。 Scrapy应用广泛网络爬虫软件教程,可用于数据挖掘、监控和自动化测试。
Scrapy 的吸引力在于它是一个任何人都可以根据自己的需求轻松修改的框架。 它还提供了各类爬虫的基类,例如baseSpider、站点地图爬虫等,最新版本还提供了对web2.0爬虫的支持。
5.1 Scrapy爬虫框架结构
引擎:控制所有模块之间的数据流,并根据条件触发事件。
下载器:根据要求下载网页
调度程序:调度和管理所有抓取请求
Spider:解析Downloader返回的响应,生成爬行项,并生成额外的爬行请求。
Item Pipelines:以管道方式处理Spider生成的爬取项目,可能包括对爬取项目中的HTML数据进行清理、检查和重复检查,并将数据存储到数据库中。
5.2 数据流向
1. 引擎打开一个网站(打开一个域名),找到处理该网站的蜘蛛,并向蜘蛛请求第一个要爬取的URL。
2、引擎从Spider中获取第一个要爬取的URL,并用Scheduler中的Request进行调度。
3.引擎向调度程序请求下一个要抓取的URL。
4、调度器将下一个要爬取的URL返回给引擎,引擎将URL通过下载中间件(请求方向)转发给下载器。
5、页面下载完成后,下载器会生成该页面的Response,并通过下载中间件发送到引擎(返回(响应)方向)。
6、引擎收到下载器的Response,通过Spider中间件(输入方向)发送给Spider处理。
7. Spider处理Response并将爬取的Item和(后续)新的Request返回给引擎。
8.引擎将爬取的Item(Spider返回)发送到Item Pipeline,并将Request(Spider返回)发送到调度器。
9. 重复(从步骤 2 开始),直到调度程序中不再有请求并且引擎关闭站点。
6.分布式爬虫
6.1 多线程爬虫
当爬取的数据量较小时,我们采用串行下载网页,只有在上一次下载完成后才会开始新的下载。 数据量小时还是可以处理的。 但当涉及到大型网站时,性能就会显得不足。 如果我们能够同时下载多个网页,下载时间将会得到显着的改善。
我们将串行下载爬虫扩展为并行下载。 需要注意的是网络爬虫软件教程,如果滥用该功能,多线程爬虫请求内容过快,可能会导致服务器过载或者IP地址被屏蔽。 为了避免这个问题,我们的爬虫必须设置一个延迟标志来设置请求同一域名时的最小时间间隔。
在Python中实现多线程是比较简单的。 Python中的thread模块是一个比较底层的模块。 Python的threading模块封装了线程,可以更方便地使用。
简单看一下thread模块中的函数和常量:
Thread中常用的函数和对象:
一般来说,线程的使用有两种模式。 一种是创建一个线程要执行的函数,将这个函数传入Thread对象中,让它被执行。 另一种是直接继承Thread并创建一个新的类。 将线程执行的代码放入这个新类中。
实现多进程参考代码及示例:
6.2 多进程爬虫
Python中的多线程并不是真正的多线程,无法充分利用多核CPU资源。
如果你想充分利用它,大多数情况下你需要在python中使用多个进程,那么这个包称为multiprocessing。
有了它,就可以轻松完成从单进程到并发执行的转换。 多处理支持子进程、通信和共享数据,执行不同形式的同步,并提供Process、Queue、Pipe、Lock等组件。
Process的基本使用:
在多处理中,每个进程都由一个 Process 类表示。 首先看一下它的API:
我们先用一个例子来感受一下:
创建Process的最简单的过程如上所示。 target 传入函数名,args 是元组形式的函数参数。 如果只有一个参数,则为长度为1的元组。
然后调用start()方法启动多个进程。
另外,还可以通过cpu_count()方法和active_children()方法获取当前机器的CPU核心数以及当前运行的所有进程。
我们通过一个例子来感受一下:
运行结果:
通过启动多个进程来实现爬虫会大大降低爬取信息的速度。 详细介绍请参考:
7. 异步网站数据采集
在收集网页信息时,我们会遇到网页的加载模型是瀑布流的形式。 页面URL没有改变,但内容仍然可以加载。 这时候我们就需要对网页中的Javascript中的一些代码进行分析,获取我们需要的数据。
对于使用 JS 渲染的页面,建议使用 PhantomJS,一种无界面、可脚本编程的 WebKit 浏览器。 参考:
Selenium 是一个自动化测试工具。 可以轻松实现Web界面测试。 PhantomJS用于渲染和解析JS,Selenium用于用Python驱动和编写界面,然后Python进行后处理。 参考:
8、爬虫的存放
我们刚接触爬虫的时候,习惯于在命令行输出小爬虫结果。 看着命令行中的一行行数据似乎很有成就感。 然而,随着数据的增加和需要进行数据分析,将数据打印到命令行就不再是一种选择。 为了远程使用大多数网络爬虫,我们仍然需要存储收集到的数据。
8.1 媒体文件
媒体文件常见的存储方式有两种:直接获取URL链接,或者直接下载源文件。 但建议使用第一种方法。 优点如下:
当然,这样做有一些缺点:
8.2 将数据存储到 CSV
CSV 是一种用于存储表格数据的常见文件格式。 每行由换行符分隔,列由逗号分隔。 Python中的CSV库可以非常简单地修改CSV文件,也可以从头开始创建CSV文件:
我们可以利用csv模块提供的功能,将爬虫获取到的信息存储到csv文件中。
8.3 MySQL
对于爬虫数据量很大,并且后期我们需要反复使用它来过滤和分析数据,我们选择将其存储在数据库中。
MySQL是目前最流行的开源关系数据库管理系统。 它是一个非常灵活、稳定且功能齐全的DBMS。 许多顶级网站都在使用它,例如 YouTube、Twitter、Facebook 等。
Python中没有内置的MySQL支持工具,但是有很多可以用来与MySQL交互的开源库,其中最著名的是PyMySQL。
结合上述过程,将爬虫获取到的数据存储到数据库中。
9.爬虫常用技巧
9.1 模拟登录
当前大多数网站都使用 cookie 来跟踪有关用户是否登录的信息。网站验证您的登录凭据后,会将其存储在您浏览器中的 cookie 中,其中通常包含服务器生成的令牌、登录到期日期和状态跟踪信息。 当我们浏览网站的每个页面时,网站都会使用此cookie作为信息验证的证据并将其呈现给服务器。
通过Chrome等浏览器自带的开发者工具,我们从网络中获取所请求网页的header和form。 在Header中,我们可以查看cookie中存储的登录信息。 我们可以通过Scrapy设置请求网页的头部信息。 ,并在本地存储cookie,以达到模拟登录的效果。 详细操作请查看博客:/p/b7f41df6202d
9.2 网页验证码
简单来说,验证码就是一张图片,上面有一个字符串。 网站是如何实施的? 有WEB背景的人可能知道,每个浏览器基本上都有cookie作为这个响应的唯一标识。 每次您访问网站时,您的浏览器都会将此 cookie 发送到服务器。 验证码与该cookie绑定。 怎么理解呢? 例如,有一个网站W,A和B两个人同时访问W。 W返回给A的验证码是X,返回给B的验证码是Y。两个验证码都是正确的,但是如果A输入了B的验证码,验证肯定会失败。 服务器如何区分A和B? 它使用cookie。 又比如,某些网站登录一次后,下次继续访问时可能会自动登录。 cookie 还用于识别唯一身份。 如果您清除cookie,您将无法自动登录。
对于一些简单的验证码,我们可以通过机器来识别,但对于一些人眼难以识别的验证码,我们只能寻找更复杂的技术。 简单的验证码识别过程就是对验证码图像的处理过程。