反爬虫机制
- 需求背景
- 网站内容使用js动态加载,一般的爬虫无法抓取
- 分析目标站点
- 使用 shell 调试工具
- 动态加载比如请求api得到新数据
- 向动态请求图片api发起请求
json.loads(response.text)
函数来加载处理响应的api数据对象
- 小计
- Spider 到底应该使用 XPath 或 CSS 选择器来提取响应数据,还是使用 JSON,完全取决于目标网站的响应内容
scrapy crawl unsplash_image
爬虫启动- 可以shell界面,response.headers 查看响应体,作对应处理
- 常规反爬虫
- 通过 User-Agent 请求头验证是否为浏览器
- 使用 JavaScript 动态加载资源,需要抓取请求api
反爬虫解决方案
- ip地址验证
- 思路 不断地随机更换代理服务器的 IP 地址
- 方案
middlewares.py
通过自定义的下载中间件为 Scrapy 设置了代理服务器- 需要开发者事先准备好一系列代理服务器
settings.py
文件设置启用自定义的下载中间件
- 禁用Cookie
- 场景 有些网站通过跟踪 Cookie 来识别是否是同一个客户端
- 方案
- 在配置文件中关闭默认开启的cookie选项
COOKIES_ENABLED = False
- 在配置文件中关闭默认开启的cookie选项
- 违反爬虫规则文件
- 有些网站robots.txt 文件,制定了爬虫规则
- 方案 指定不遵守爬虫规则ROBOTSTXT OBEY = False
- 限制访问频率
- 场景
- 当同一个 IP 地址、同一个客户端访问目标网站过于频繁时,很可能会被当成机器
- 为了更好地模拟正常用户的访问速度,可以限制 Scrapy 的访问频率
- 比如开启频率限制,设置访问开始延迟,访问之间最大延迟,并行每台服务器请求数量,下载后的自动延迟
- 场景
- 图形验证码
- 场景 为了防止机器程序访问,对同客户同ip达到一定访问次数,会要求输入图形验证码
- 解决思路 让机器识别验证码
- 使用 PIL、Libsvrn 等库自己开发程序来识别图形验证码
- 通过第三方识别。有不少图形验证码的在线识别网站,但识别率高往往需要收费
Scrapy Selenium整合
- 爬取受保护资源
- 需求场景
- 有些网站必须登录才能获取网络数据
登录网站常规做法
- 直接用爬虫程序向网站的登录处理程序提交帐号参数,记录登录成功后的Cookie数据
- 使用真正的浏览器来模拟登录,然后记录浏览器登录之后的 Cookie 数据
模拟 VS 使用浏览器信息
- 前者需要开发者处理一些复杂行为,自主可控,效率高、灵活性好。缺点依赖编程,若目标强反爬机制,则费时处理。
- 后者简单易用,缺点在于需要启动真实的浏览器,用浏览器加载页面,效率较低
Selenium
- Web 应用的自动化测试工具(最开始用Java写成的)
- Selenium 可以驱动浏览器对 Web 应用进行测试
- 爬虫程序正是借助于 Selenium 的这个功能来驱动浏览器登录 Web 应用
- python程序中使用Selenium库
- 安装 selenium
- 为 Selenium 下载对应的浏览器驱动
- 安装目标浏览器
总之,没有爬不到的数据,只要技术足够。爬与反爬虫互为矛盾