一、robots协议
robots.txt协议是一种互联网标准,全称为“网络爬虫排除标准”(Robots Exclusion Protocol),是网站管理员与网络爬虫(包括搜索引擎爬虫和其他自动抓取网页内容的软件)之间的一种通信方式。这个协议通过一个名为robots.txt
的文本文件实现,该文件存放在网站的根目录下,对任何互联网用户都是公开可见的。
1.robots.txt文件的功能和结构:
(1) 功能:
robots.txt
文件主要用来指定搜索引擎或其他爬虫在访问网站时哪些内容可以抓取,哪些内容不应该抓取。- 管理员可以限制爬虫对某些敏感或者私密信息、后台管理界面、重复内容、测试页面、登录页面等的访问,从而保护网站的部分或全部内容不被索引和展示在搜索引擎的结果中。
- 同时,robots.txt也可以用来指明网站的网站地图(Sitemap)位置,方便搜索引擎快速发现和抓取网站的重要更新内容。
(2) 结构和语法:
-
robots.txt
文件由一系列指令组成,每一条指令针对一组特定的爬虫或所有爬虫。
指令的基本格式如下:
User-agent: [爬虫名称]
Disallow: [不允许访问的URL路径]
Allow: [允许访问的URL路径]
User-agent
: 定义这一行规则适用的爬虫。如果写的是*
,则表示适用于所有爬虫。Disallow
: 设置不允许访问的相对URL路径。比如,Disallow: /private/
意味着爬虫不应访问www.example.com/private/
及其子目录下的任何页面。Allow
: (可选)明确指出某个之前被Disallow
过的URL路径下的部分资源是可以被访问的。不过,由于并非所有爬虫都支持Allow
指令,所以实践中更多是通过取消Disallow
限制来达到允许访问的目的。
注意:robots.txt文件不提供密码保护或加密功能,只是起到君子协定的作用,恶意爬虫可能会无视这个文件的规定。
示例:
User-agent: *
Disallow: /admin/
Disallow: /private/
Sitemap: http://www.example.com/sitemap.xml
在这个例子中,所有爬虫都被要求不要抓取位于/admin/
和/private/
路径下的任何内容,并且通过Sitemap指令告知爬虫网站地图的位置。
最后,尽管大多数知名的搜索引擎都会遵循robots.txt的规则,但它并不是强制性的法律约束,也就是说,爬虫开发者可以选择是否遵循这些指导原则。此外,robots.txt并不提供安全性,不能阻止未经授权的访问,若要保护敏感数据,必须采取更高级别的安全措施。
2. 如何找到一个网站的robots.txt
要找到一个网站的robots.txt文件,可以通过在该网站的根目录下添加/robots.txt路径来查看。具体步骤如下:
-
打开您喜欢的网络浏览器(如Chrome、Firefox等)。
-
在浏览器的地址栏中输入目标网站的网址,例如https://www.example.com/,然后在网址后面添加/robots.txt,即https://www.example.com/robots.txt。
-
按下回车键,浏览器将尝试访问该网站的robots.txt文件。
-
如果网站存在robots.txt文件,浏览器将显示该文件的内容。如果网站没有设置robots.txt文件或无法访问该文件,浏览器可能会显示404错误页面或其他提示信息。
通过这种方法,您可以轻松地查看任何网站的robots.txt文件,了解网站所有者对搜索引擎爬虫的访问规则。请注意,robots.txt文件中的内容可能会有所不同,具体规则取决于网站所有者的设置。
例如:百度的网站为:http://www.baidu.com,在后面加上/robots.txt(baidu.com/robots.txt)就可以看到如下信息:
User-agent: Baiduspider
Disallow: /baidu
Disallow: /s?
Disallow: /ulink?
Disallow: /link?
Disallow: /home/news/data/
Disallow: /bh
User-agent: Googlebot
Disallow: /baidu
Disallow: /s?
Disallow: /shifen/
Disallow: /homepage/
Disallow: /cpro
Disallow: /ulink?
Disallow: /link?
Disallow: /home/news/data/
Disallow: /bh
User-agent: MSNBot
Disallow: /baidu
Disallow: /s?
Disallow: /shifen/
Disallow: /homepage/
Disallow: /cpro
Disallow: /ulink?
Disallow: /link?
Disallow: /home/news/data/
Disallow: /bh
User-agent: Baiduspider-image
Disallow: /baidu
Disallow: /s?
Disallow: /shifen/
Disallow: /homepage/
Disallow: /cpro
Disallow: /ulink?
Disallow: /link?
Disallow: /home/news/data/
Disallow: /bh
User-agent: YoudaoBot
Disallow: /baidu
Disallow: /s?
Disallow: /shifen/
Disallow: /homepage/
Disallow: /cpro
Disallow: /ulink?
Disallow: /link?
Disallow: /home/news/data/
Disallow: /bh
User-agent: Sogou web spider
Disallow: /baidu
Disallow: /s?
Disallow: /shifen/
Disallow: /homepage/
Disallow: /cpro
Disallow: /ulink?
Disallow: /link?
Disallow: /home/news/data/
Disallow: /bh
User-agent: Sogou inst spider
Disallow: /baidu
Disallow: /s?
Disallow: /shifen/
Disallow: /homepage/
Disallow: /cpro
Disallow: /ulink?
Disallow: /link?
Disallow: /home/news/data/
Disallow: /bh
User-agent: Sogou spider2
Disallow: /baidu
Disallow: /s?
Disallow: /shifen/
Disallow: /homepage/
Disallow: /cpro
Disallow: /ulink?
Disallow: /link?
Disallow: /home/news/data/
Disallow: /bh
User-agent: Sogou blog
Disallow: /baidu
Disallow: /s?
Disallow: /shifen/
Disallow: /homepage/
Disallow: /cpro
Disallow: /ulink?
Disallow: /link?
Disallow: /home/news/data/
Disallow: /bh
User-agent: Sogou News Spider
Disallow: /baidu
Disallow: /s?
Disallow: /shifen/
Disallow: /homepage/
Disallow: /cpro
Disallow: /ulink?
Disallow: /link?
Disallow: /home/news/data/
Disallow: /bh
User-agent: Sogou Orion spider
Disallow: /baidu
Disallow: /s?
Disallow: /shifen/
Disallow: /homepage/
Disallow: /cpro
Disallow: /ulink?
Disallow: /link?
Disallow: /home/news/data/
Disallow: /bh
User-agent: ChinasoSpider
Disallow: /baidu
Disallow: /s?
Disallow: /shifen/
Disallow: /homepage/
Disallow: /cpro
Disallow: /ulink?
Disallow: /link?
Disallow: /home/news/data/
Disallow: /bh
User-agent: Sosospider
Disallow: /baidu
Disallow: /s?
Disallow: /shifen/
Disallow: /homepage/
Disallow: /cpro
Disallow: /ulink?
Disallow: /link?
Disallow: /home/news/data/
Disallow: /bh
User-agent: yisouspider
Disallow: /baidu
Disallow: /s?
Disallow: /shifen/
Disallow: /homepage/
Disallow: /cpro
Disallow: /ulink?
Disallow: /link?
Disallow: /home/news/data/
Disallow: /bh
User-agent: EasouSpider
Disallow: /baidu
Disallow: /s?
Disallow: /shifen/
Disallow: /homepage/
Disallow: /cpro
Disallow: /ulink?
Disallow: /link?
Disallow: /home/news/data/
Disallow: /bh
User-agent: *
Disallow: /
二、渲染规律
网页的渲染涉及到客户端(浏览器)与服务器端的交互,以及JavaScript执行和CSS样式应用等多个步骤。未经渲染的原始HTML代码并不能反映出用户最终看到的页面状态,尤其是对于依赖AJAX异步加载、React/Vue等前端框架动态生成的内容。因此,在进行复杂网页爬取时,可能需要结合Headless Chrome(如Puppeteer)或Selenium等工具模拟浏览器环境执行JavaScript,确保获取完整的渲染后页面数据。
三、选取范围
在开发网络爬虫时,我们需要明确我们要从网页中抽取哪些具体信息。选取范围可能包括但不限于:
- 文本内容:如新闻文章正文、产品描述、评论内容等。
- 属性信息:HTML标签的属性值,如链接
<a>
标签的href
属性、图片<img>
标签的src
属性、表单<input>
标签的value
属性等。 - 结构化数据:表格
<table>
中的单元格数据、列表<ul>/<ol>
中的条目、自定义数据属性(如data-*
属性)等。 - CSS类和ID:用于辅助定位重要区块,如文章主体、页眉、页脚等。
针对这些不同的内容,我们可以采用各种解析手段,如正则表达式、BeautifulSoup、lxml等Python库提供的方法,以及XPath或CSS选择器来精准定位和抽取。
四、确定数据来源
-
API接口获取:很多网站和应用程序提供公开或半公开的API接口,允许程序直接获取已结构化的数据。这种方式具有速度快、稳定性好、数据格式统一等特点,但可能需要认证授权,并遵守API的使用条款。
-
网页爬取:
- 静态网页:只需发送HTTP请求获取HTML页面,然后解析其中的数据。
- 动态网页:除了获取基础HTML外,还需模拟用户交互行为触发Ajax请求,捕获额外的数据流。
- JS逆向:(待补充)
五、获取方式
-
接口获取:利用requests、aiohttp等HTTP客户端库发送请求,对接口返回的JSON/XML数据进行解析,并转化为结构化数据。
-
自动化框架:
- Scrapy:强大的Python爬虫框架,提供了请求调度、数据解析、中间件、Item Pipeline等功能,便于构建大型、分布式爬虫项目。
- Selenium、Puppeteer、Playwright:适用于需要浏览器渲染和模拟用户交互的场景,能够处理复杂的动态加载内容。
六、数据存放方式
-
数据库:根据数据类型和规模选择合适的数据库系统进行存储,如MySQL、PostgreSQL、MongoDB等,也可以使用云端数据库服务如AWS RDS、阿里云RDS等。
-
Excel文件:适合小规模数据导出,可以使用pandas等数据处理库将数据写入Excel文件,便于数据分析和共享。
-
其他存储方式:根据需求还可选择CSV、JSON、XML文件存储,或者是NoSQL数据库如Redis、Cassandra等,甚至是大数据存储方案如Hadoop HDFS、Google BigQuery、AWS S3等。
七、反爬
反爬虫是指网站为了阻止爬虫程序对其网页进行数据抓取而采取的一系列技术手段。常见的反爬虫策略包括:
-
验证码:要求用户输入验证码才能访问网页,防止自动程序的访问。
-
IP限制:限制单个IP地址的访问频率,过快的访问会被封禁IP。
-
User-Agent检测:检测HTTP请求中的User-Agent字段,如果不是常见的浏览器User-Agent,可能会被判定为爬虫程序。
-
Cookie检测:检测HTTP请求中的Cookie,如果没有合适的Cookie,可能会被判定为爬虫程序。
-
动态加载:网页使用JavaScript动态加载数据,爬虫程序无法直接获取到数据。
-
数据加密:对数据进行加密处理,需要解密才能获取原始数据。
-
频率检测:检测访问频率,如果访问频率过高,可能会被封禁。
应对反爬虫策略的方法包括:
-
使用代理IP:通过使用代理IP来隐藏真实IP地址,降低被封禁的风险。
-
设置随机User-Agent:在HTTP请求中设置随机的User-Agent,模拟真实浏览器的行为。
-
使用验证码识别技术:通过自动识别验证码的技术来应对验证码反爬虫策略。
-
降低访问频率:控制爬取数据的频率,避免被封禁。
-
解析JavaScript:对网页中的JavaScript代码进行分析,找到数据请求的接口和参数,直接发送请求获取数据。
总的来说,反爬虫是网站为了保护数据安全和防止恶意爬取而采取的一种合理措施,爬虫程序在进行数据抓取时需要遵守网站的规则和使用条款,以避免触发反爬虫策略。
八、《爬虫:从入门到入狱》
-
除了提及的User-Agent切换、IP代理轮换、验证码识别等问题,还需要留意网站的robots.txt文件规则,尊重网站设定的爬虫访问策略。有时可能需要设置合理的爬取频率,避免给目标服务器带来过大压力。
-
在编写和运行爬虫时务必遵守相关法律法规,不得侵犯个人隐私,不进行未经授权的大规模数据抓取。在必要时应取得数据提供方的书面许可。
-
为了防止对目标网站服务器造成过大压力,爬虫应当适当控制请求频率,遵循网站的服务条款,并在必要时申请API权限或获得书面许可。