反爬虫机制
需求背景
网站内容使用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 违反爬虫规则文件 - 有些网站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 下载对应的浏览器驱动安装目标浏览器
总之,没有爬不到的数据,只要技术足够。爬与反爬虫互为矛盾