引子

最近在爬取一个网站时, 遇到了521错误, 这是一种网站的反爬技术, 浏览器会渲染很多东西, 代码爬数据会漏掉浏览器渲染的信息

思路

可以尝试复制浏览器的cookie信息, 加在请求头中, 但是这样只能获取单个域名的网页。恰巧我需要爬取的网站下面有多个二级域名的网页(二级域名网页的链接可以通过一级域名获取), 复制每个二级域名的cookie来爬取每个二级域名的网页是不太可能的

进一步的方案是通过PhantomJS的无头浏览器发送两次请求, 第一次请求获取一部分Cookie(__jsl_clearance)的信息, 第二次请求再将这部分Cookie加在Header信息中, 就可以获得网页内容

第一次尝试

urls = request.url.split("/")
host = urls[-2]headers = {"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8","Accept-Language": "zh-CN,zh;q=0.8,en;q=0.6","Connection": "keep-alive","Host": host,"Referer": request.url,"Upgrade-Insecure-Requests": 1
}
ua = random.choice(spider.settings.get("UAPOOL"))
headers["User-Agent"] = uacap = DesiredCapabilities.PHANTOMJS.copy()
for key, value in headers.items():cap['phantomjs.page.customHeaders.{}'.format(key)] = value
driver = webdriver.PhantomJS(desired_capabilities=cap)
driver.get(request.url)
cj = driver.get_cookies()

上面的代码, 构造请求的头信息, 通过PhantomJS发起第一次请求, 获得cookies

cookie = ''
for c in cj:cookie = cookie + c['name'] + '=' + c['value'] + ';'
cookie = cookie[:-1]
headers['Cookie'] = cookiedcap = DesiredCapabilities.PHANTOMJS.copy()
for key, value in headers.items():dcap['phantomjs.page.customHeaders.{}'.format(key)] = valuetime.sleep(10)
driver2 = webdriver.PhantomJS(desired_capabilities=dcap)
driver2.get(request.url)
content = driver2.page_source.encode('utf-8')
return HtmlResponse(request.url, encoding='utf-8', body=content, request=request)

通过第一次请求返回的cookie, 构造头部的Cookie, 并发起第二次请求, 注意第一次和第二次发起的请求的头部信息相同, 只是第二次加入了Cookie的信息

通过发起二次请求的方式可以获取到网页的内容, 但是这种方式不太稳定, 经常连续发送几次就会有一段时间获取不到网页, 让人感觉很崩溃。于是尝试过滤掉这部分拉取不到的请求, 将这部分请求的url记录在数据库, 并重复爬取。但又遇到一个新的问题, PhantomJS连续拉取到一定的次数, 就会长时间的没有响应, 加超时时间也不管用

将PhantomJS和Scrapy整合在一起会导致网页一次都拉取不到, 猜想可能因为PhantomJS是一种串行的爬取方式, 而Scrpay是一种异步的拉取的方式, 这两种方式有冲突。

第二次尝试

通过第一次尝试得出两个结论, 第一: PhantomJS不太可靠, 网上得知PhantomJS已经不再维护, 于是考虑使用PhantomJS的替代品Chrome Driver. 第二: Scrapy多线程的拉取方式和PhantomJS/Chrome Driver无头的串行拉取方式没法融合. 于是想到单独使用Phython写一个原生的爬虫

这里只共享通过Chrome Driver + selenium解决521反爬的方案

headers = {"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8","Accept-Language": "zh-CN,zh;q=0.8,en;q=0.6","Connection": "keep-alive","Upgrade-Insecure-Requests": 1
}
ua = random.choice(UAPOOL)
headers["User-Agent"] = ua
host = url.split("/")[2]
headers["Host"] = host
headers["Referer"] = urlcj = Content.get_cookie(url, ua)

get_cookie方法

chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
user_agent = 'user-agent='+ua
chrome_options.add_argument(user_agent)
driver = webdriver.Chrome(chrome_options=chrome_options, executable_path="/home/bearyb/chromedriver")try:driver.get(url)cj = driver.get_cookies()driver.quit()return cj
except TimeoutException:print("first time get " + url + " timeout")driver.quit()return ''

还是和之前一样, 构建第一次请求通过get_cookie获取cookie, 可以看到在get_cookie方法里已经将PhantomJS换成了chrome driver的headless方式

cookie = '_ga=GA1.2.413717745.1574286560;UM_distinctid=16e8aca983f9-09c74e905834908-76256753-13c680' \'-16e8aca984088;Hm_lvt_dfa5478034171cc641b1639b2a5b717d=1576274996,1576361248,1576673944,' \'1576794342;g=HDF.145.5deb431611b32;_gid=GA1.2.742943599.1576794342;CNZZDATA-FE=CNZZDATA-FE;' \'Hm_lpvt_dfa5478034171cc641b1639b2a5b717d=1576800627;' \'CNZZDATA1256706712=' + '36179960-1576796605-https%253A%252F%252F' + host + '%252F%7C1576796605;'for c in cj:cookie = cookie + c['name'] + '=' + c['value'] + ';'
cookie = cookie[:-1]headers['Cookie'] = cookie
return Content.get_content(url, headers)

get_content方法

def get_content(url, headers):dcap = DesiredCapabilities.PHANTOMJS.copy()for key, value in headers.items():dcap['phantomjs.page.customHeaders.{}'.format(key)] = valuetime.sleep(10)session = requests.Session()html = session.get(url, headers=headers).content.decode('gbk')content = etree.HTML(html)return content

将第一次请求的Cookie加入到header中再次请求, 就能获得返回的网页, 第二次请求没有使用Chrome的请求方式, 而是使用了python框架的requests模块

后话:

所谓道高一尺, 魔高一丈, 这个问题前前后后一直困扰了我两个多星期, 不断的尝试, 不断的失败, 不停的调整方向, 还好最后终于解决了问题. 在这里分享给大家解决521反爬的思路, 望学习的道路上共同进步!

Scrapy反爬虫之521异常相关推荐

  1. scrapy反爬虫与反反爬虫总结

    scrapy反爬虫与反反爬虫文章比较多,都简谈不全,现在搜集好多资料,梳理一下思路,总结了一下内容. 1. 反爬虫技术 首先我们来思考一下,为什么要反爬虫? 网络中充斥大量爬虫的情况下,会使得整个网络 ...

  2. Scrapy绕过反爬虫策略汇总

    文章目录 一.Scrapy无法返回爬取内容的几种可能原因 1,ip封锁爬取 2,xpath路径不对 3,xpath路径出现font,tbody标签 4,xpath路径不够明确 5,robot协议 6, ...

  3. Scrapy突破反爬虫的限制

    7-1 爬虫和反爬的对抗过程以及策略 基本概念 爬虫:自动获取网站数据的程序,关键是批量的获取 反爬虫:使用技术手段防止爬虫程序的方法 误伤:反爬技术将普通用户识别为爬虫,如果误伤过高,效果再好也不能 ...

  4. 使用scrapy做爬虫遇到的一些坑:网站常用的反爬虫策略,如何机智的躲过反爬虫Crawled (403)

    在这幅图中我们可以很清晰地看到爬虫与反爬虫是如何进行斗智斗勇的. 在学习使用爬虫时,我们制作出来的爬虫往往是在"裸奔",非常的简单. 简单低级的爬虫有一个很大的优点:速度快,伪装度 ...

  5. python3 scrapy实战:爬取猎聘网招聘数据至数据库(反爬虫)

    首先注明:感谢拉勾网提供的权威.质量的数据,本人抱着学习的态度,不愿增加其服务器负担,与dos攻击. 继前两篇爬取拉勾网.直聘网后的第三篇文章,同样是使用scrapy来获取网站的招聘信息,并且保存至M ...

  6. scrapy框架开发爬虫实战——反爬虫策略与反反爬虫策略

    反爬虫.反反爬虫 简单低级的爬虫有一个很大的优点:速度快,伪装度低.如果你爬取的网站没有反爬机制,爬虫们可以非常简单粗暴地快速抓取大量数据,但是这样往往就导致一个问题,因为请求过多,很容易造成服务器过 ...

  7. python 下载文件 限速-Python网络爬虫---scrapy通用爬虫及反爬技巧

    一.通用爬虫 通用爬虫一般有以下通用特性:爬取大量(一般来说是无限)的网站而不是特定的一些网站. 不会将整个网站都爬取完毕,因为这十分不实际(或者说是不可能)完成的.相反,其会限制爬取的时间及数量. ...

  8. 第7章 Scrapy突破反爬虫的限制

    7-1 爬虫和反爬的对抗过程以及策略 Ⅰ.爬虫和反爬虫基本概念 爬虫:自动获取网站数据的程序,关键是批量的获取. 反爬虫:使用技术手段防止爬虫程序的方法. 误伤:反爬虫技术将普通用户识别为爬虫,如果误 ...

  9. python爬虫反爬机制_Python Scrapy突破反爬虫机制(项目实践)

    对于 BOSS 直聘这种网站,当程序请求网页后,服务器响应内容包含了整个页面的 HTML 源代码,这样就可以使用爬虫来爬取数据.但有些网站做了一些"反爬虫"处理,其网页内容不是静态 ...

最新文章

  1. 一份火爆国外的PyCharm快捷键和Python代码速查表
  2. java编程时 尽量少用_Java编程语言基础知识的要点
  3. linux awk 多分隔符
  4. POJ 1321 棋盘问题 题解
  5. 【caffe】mnist数据集lenet训练与测试
  6. matlab 判断鼠标按下,Matlab:如何通过使用回调来获取当前鼠标在点击位置
  7. 【clickhouse】clickhouse 同时查询数过多 Too many simultaneous queries
  8. Facebook 推机器视觉方案,能轻易读懂图片信息
  9. (转)android之Fragment(官网资料翻译)
  10. java多线程编程--模拟龟兔赛跑过程
  11. 华擎主板安装linux系统,华擎B365主板安装win7详细步骤
  12. python局域网大文件_利用Python+pyftpdlib实现在局域网中互传文件
  13. 使用安卓模拟器和GPA截帧分析手游
  14. GraphQL简介及入门
  15. 华为云服务器(Centos7)安装与卸载mysql8
  16. 这后台管理系统,有逼格!(附源码)
  17. 复杂事件处理引擎—Esper 处理模型
  18. 李政道与冯诺依曼计算机的基本原理,你们知道各个领域的领头人是哪几个?
  19. 从2.3.3到4.1.1:最全的android系统源码下载大集合
  20. 1.8 faker简单应用

热门文章

  1. Nenu算法模拟测试
  2. To B端SaaS产品运营该如何开展?整理了一套SaaS运营的框架
  3. Linux入门八:Linux的其他文本工具:echo,cat,tail,grep;
  4. LPSTR LPCTSTR
  5. 阿里云centos 7 apache 配置虚拟站点
  6. WordPress主题 大前端 阿里百秀 XIU 小清新CMS高级主题[更新v6.0]
  7. ActiveMQ底层原理及安装使用详解
  8. 「高并发」亿级流量场景下如何实现分布式限流?
  9. 刚刚!知网开放个人查重服务,研究生学位论文3次免费,网友吐糟:「毕业了才开放」...
  10. cps和dsp渠道手法的研究