爬虫抓取网页数据(使用Python网络爬虫首先需要了解一下什么是HTTP的请求)
优采云 发布时间: 2021-10-06 07:02爬虫抓取网页数据(使用Python网络爬虫首先需要了解一下什么是HTTP的请求)
要使用 Python 网络爬虫,首先需要了解什么是 HTTP,因为这与 Python 爬虫的基本原理密切相关。正是围绕着这些底层逻辑,Python爬虫才能一步步进行。
HTTP的全称是Hyper Text Transfer Protocol,中文称为Hyper Text Transfer Protocol。它用于将超文本数据从网络传输到本地浏览器。它也是 Internet 上使用最广泛的网络传输协议。
请求和响应
当我们在浏览器中输入 URL 并按 Enter 键时,浏览器会向 网站 所在的服务器发送请求。服务器收到请求后,会解析处理,然后返回浏览器对应的响应。收录页面源代码等内容,我们在浏览器上看到的内容经过浏览器解析后呈现出来。这整个过程就是 HTTP 请求和响应。
请求方法 有两种常见的请求方法:GET 和 POST。两者的主要区别在于GET请求的内容会反映在URL中,POST请求的内容会反映在表单中。因此,当涉及到一些敏感或私密的信息时,例如用户名和密码,我们使用POST请求来传递信息。.
响应状态码 请求完成后,客户端会收到服务器返回的响应状态。常见的响应状态码有 200(来自服务器的正常响应)、404(未找到页面)、500(服务器内部发生错误)等。
2.网页
爬取的时候,我们通过网页源代码和响应中得到的JSON数据提取需要的信息和数据,所以需要了解网页的基本结构。一个网页基本上由以下三部分组成:
HTML,全称Hyper Text Marked Language,中文称为Hypertext Marked Language,用于表达网页呈现的内容,如文字、图片、视频等,相当于一个网页的骨架。
JavaScript,简称JS,是一种可以为页面添加实时、动态、交互功能的脚本语言,相当于一个网页的肌肉。
CSS,全称Cascading Style Sheets,中文叫Cascading Style Sheets。它对网页进行布局和装饰,使网页美观大方,相当于网页的皮肤。
3.基本原则
Python爬虫的基本原理其实是围绕HTTP和网页结构展开的:首先请求网页,然后解析提取信息,最后存储信息。
1) 请求
Python经常用来请求的第三方库有requests和selenium,内置库也可以使用urllib。
requests 是用 Python 编写的,基于 urllib,使用 Apache2 许可的开源协议的 HTTP 库。与urllib库相比,requests库更方便,可以为我们节省很多工作,所以我们倾向于使用requests来请求网页。
Selenium 是一个 Web 应用的自动化测试工具,它可以驱动浏览器执行特定的动作,比如输入、点击、下拉等,就像真实用户在操作一样,常用于爬虫解决 JavaScript 渲染问题。Selenium 可以支持多种浏览器,如 Chrome、Firefox、Edge 等,在通过 selenium 使用这些浏览器之前,需要配置相关的浏览器驱动:
2)解析和提取
Python用来解析和提取信息的第三方库包括BeautifulSoup、lxml、pyquery等。
每个库可以使用不同的方法来提取数据:
此外,您还可以使用正则表达式来提取您想要的信息。有了它,字符串检索、替换和匹配就是一切。
3)存储
提取数据后,将数据存储起来。最简单的数据可以保存为文本文件,如TXT文本、CSV文件、Excel文件、JSON文件等,也可以保存为二进制数据,如图片、音频、视频等,也可以保存到数据库中,如关系型数据库MySQL、非关系型数据库MongoDB、Redis等。
如果要将数据存储为 CSV 文件、Excel 文件和 JSON 文件,则需要使用 csv 库、openpyxl 库和 json 库。
4.静态网页抓取
了解了爬虫的基本原理之后,就可以抓取网页了,其中静态网页是最容易操作的。
抓取静态网页,我们可以选择requests来请求获取网页的源代码,然后使用BeautifulSoup进行解析提取,最后选择合适的存储方式。
5.动态网页抓取
有时在使用请求爬取网页时,会发现爬取的内容和浏览器显示的不一样。在浏览器中可以看到要爬取的内容,但是爬取后的结果却不是。它与网页是静态的还是动态的有关。
静态网页是相对于动态网页而言的。它们是指没有后端数据库、没有程序、没有交互的网页。动态网页是基本的html语法规范与Java、VB、VC等高级编程语言、数据库编程等技术的融合,以实现网站托管网页的高效、动态、交互的内容和风格。页。
两者的区别在于:
1)阿贾克斯
Ajax 不是一种编程语言,而是一种使用 JavaScript 与服务器交换数据并更新部分网页内容而无需重新加载整个页面的技术。
由于使用Ajax技术的网页中的信息是通过JavaScript脚本语言动态生成的,使用requests-BeautifulSoup的静态页面爬取方法无法抓取到数据。我们可以通过以下两种方式抓取Ajax数据:
2)Cookie 和会话
Cookie 是存储在用户本地终端上的数据(通常是加密的),用于识别用户身份以进行 Session 跟踪,由用户的客户端计算机临时或永久存储。
会话称为“会话”,存储特定用户会话所需的属性和配置信息。
在很多情况下,您需要登录才能在页面上查看更多信息。因此,面对此类网页时,需要先模拟登录,才能进一步抓取网页。当我们模拟登录时,客户端会生成一个cookie并发送给服务器。因为Cookie中存储了SessionID信息,服务器可以根据Cookie确定对应的SessionID,进而找到会话。如果当前会话有效,服务器会判断用户已经登录并返回请求的页面信息,以便进一步抓取网页。
6.APP抓取
除了web端,Python也可以抓取APP数据,但这需要一个抓包工具,比如Fiddler。
与网页端相比,APP数据爬取其实更容易,反爬虫也没有那么强。大多数返回的数据类型是json。
7.多协程
我们在做爬虫项目的时候,如果要爬取的数据很多,因为程序是一行一行的执行,爬取的速度会很慢。多协程可以解决这个问题。
使用多协程,我们可以同时执行多个任务。其实在使用多协程的时候,如果一个任务在执行过程中遇到等待,它会先执行其他任务,等待结束后又回来继续执行之前的任务。因为这个进程切换的非常快,看起来就像是同时执行了多个任务。如果用计算机的概念来解释,这其实是异步的。
我们可以使用gevent库实现多协程,使用Queue()创建队列,spawn()创建任务,最后joinall()执行任务。
8.爬虫框架
当遇到比较大的需求时,为了方便管理和扩展,我们可以使用爬虫框架来实现数据爬取。
有了爬虫框架,我们就不用一一组织整个爬虫流程,只需要关心爬虫的核心逻辑,大大提高了开发效率,节省了大量时间。爬虫框架有很多,比如Scrapy、PySpider等。
9.分布式爬虫
爬虫框架的使用大大提高了开发效率,但这些框架都是运行在同一台主机上的。如果多台主机可以一起爬取,那么爬取效率会进一步提高。将多台主机组合在一起完成一个爬虫任务,就是分布式爬虫。
10.反爬虫机制及对策
为了防止爬虫开发者过度爬取造成网站的负担或恶意爬取数据,很多网站都会设置反爬虫机制。所以我们在爬取网站的数据的时候,可以通过查看网站的robots.txt,了解哪些网站是允许爬取的,哪些是不允许爬取的。
有4种常见的爬取机制:
①请求头校验:请求头校验是最常见的反爬虫机制。许多 网站 会在 Headers 中检测 user-agent,一些 网站 还会检测 origin 和 referer。对付这种反爬虫机制,可以给爬虫添加请求头,在浏览器中以字典的形式添加相应的值。
②Cookie限制:部分网站会使用cookies来跟踪您的访问过程,如果发现爬虫的异常行为,会中断爬虫的访问。对于处理cookie限制的反爬虫,一般可以先获取网站 cookie,然后将cookie发送到服务器。您可以手动添加它或使用 Session 机制。但是对于一些网站需要用户浏览页面生成cookie的情况,比如点击按钮,可以使用selenium-PhantomJS请求网页并获取cookie。
③IP访问频率限制:有些网站会通过用户行为来判断同一IP是否在短时间内多次请求过一个页面。如果这个频率超过某个阈值,网站通常会提示爬虫并要求输入验证码,或者直接屏蔽IP拒绝服务。针对这种情况,可以使用IP代理方式绕过反爬虫,如代理池维护、付费代理、ADSL拨号代理等。
④验证码限制:很多网站需要在登录时输入验证码,常见的有:图文验证码、捷喜滑动验证码、tap验证码和方形验证码。
验证码类型