下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、注:作者为了爬虫道德,在中使用了虚拟的目标Zipru,假想它为一个站点。自己尝试时,修改为自己的需求即可。这会创建如下的目录结构: zipru_scrr zipru_scrrscrapy startproject zipru_scrrscrapy 安装参看新手向爬虫(三)别人的爬虫在干啥命令行新建名为 zipru_scrr 的工程目录。新建项目网络爬虫 Scrapy 从入门到进阶treelake 关注0.1 2017.03.30 13:49* 字数 3721 阅读 31274 评论 7 喜欢 106Advanced Web Scra: Bypassing 403 Forbidden, capt
2、chas, and more我尝试过x-ray/cheerio, nokogiri 等等爬虫框架,最终还是回到了最爱: scrapy。它确实非常直观,学习曲线友好。通过The Scrapy Tutorial(中文版)你可以在几分钟之内上手你的第一只爬虫。然后,当你需要完成一些复杂的任务时,你很可能会发现有内置好的、文档良好的方式来实现它。(Scrapy 内置了许多强大的功能,但 Scrapy 的框架结构良好,如果你还不需要某个功能,它就不会影响你。)再者,如果你最终需要某些新功能,例如一个过滤器来去量的,通常只需要简单地子类化某个组件,并做点小小的修改就可以了。现在需要添加一个小爬虫来真正做点
3、什么。创建文件 zipru_scry 添加如下内容:r/sers/zipru_s历 start_urls 列表中的来开始的抓取。先尝试一个类似下图的 列表页面。的小爬虫继承了 scrapy.Ser,它内置的 start_requests()方自动遍import scrapyclass ZipruSer(scrapy.Ser): name = ziprustart_urls = 默认情况下,大多数这些文件实际上不会被使用,它们的存在只是建议以一个合理的方式组织的代码。当前,你只需要考虑 zipru_scrr(第一个)作为项目的顶层目录,这就是任何scrapy 命令应该运行的地方,也是任何相对路径
4、的根。添加一个基本爬虫 init .py items.py middlewares.py pipelines.py settings.py sers init .py scrapy.cfg对页码元素会看到:为了让的小爬虫知道如何爬取这些,需要为 ZipruSer 类添加一个 parse(response)方法:(页面元素选取可参看Selectors 选择器简介或新 手向爬虫(一)利用工具轻松爬取简书并分析)在爬取从 start_urls 自动开始后,服务器返回的响应会自动传递给 parse(self,response)方法。在了页面中的页码元素里包含的后,由每个解 析出的url 生成新的请求对
5、象,它们的响应的方法即回调函数还是这个 parse 方法。只要这些url 还没被处理过,这些请求将被转换为响应对象,仍 然馈入 parse(self, response)方法(感谢 dupe 过滤器帮自动去重)。def parse(self, response): # 从页面中取出页码里包含的for page_url in response.css(atitle =page:attr(href).extract():page_url = response.urljoin(page_url) # 将出的 href 里的自动判断补全yield scrapy.Request(url=page_url
6、, callback=self.parse)# 由出的 url 生成新的请求对象234现在的小爬虫已经可以不断地爬取新的列表页面了。但是还没有获取到实际的信息。让加上对表格中元素的来获取信息。def parse(self, response): # 从页面中取出页码里包含的for page_url in response.xpath(/acontains(title, page)/href).extract():page_url = response.urljoin(page_url)yield scrapy.Request(url=page_url, callback=self.parse)
7、# 提取信息for tr in response.css(table.lista2t tr.lista2): tds = tr.css(td)link = tds1.css(a)0 yield title : link.css(:attr(title).extract_(),url : response.urljoin(link.css(:attr(href).extract_(),date : tds2.css(:text).extract_(),size : tds3.css(:text).extract_(),seeders:(tds4.css(:text).extract_(),lee
8、chers:(tds5.css(:text).extract_(),uploader: tds7.css(:text).extract_(),在出url 生成新的请求后,的小爬虫会处理当前页面的信息,生成一个字典项目,作为爬虫数据输出的一部分。(Scrapy 会根据类型自对大多数的数据抓取来说,的任务就已经完成了。在命令行运行: 个目标爬虫停止了。可以用tcpdump 来比较两次请求如果手动浏览器的差异。但该显示正常,首先需要检查的是 User Agent 参数。的第一个请求获得了一个 403 响应,它会被忽略,然后因为只给了一这时要考虑是否有公开 API 可以使用,或者耐心分析下问题。简单s
9、crapy.extens.logss INFO: Crawled 0 pages (at 0 pages/min), scrd0 items (at 0 items/min) DEBUG:net console listening on :6023scrapy.core.engine DEBUG: Crawled (403) (referer: None) partialscrapy.core.engine DEBUG: Crawled (403) GET(referer: None) partialscrapy.sermiddlewares.httperror INFO: Ignoring
10、response : HTTP sus code is nondled ornot allowedscrapy.core.engine INFO: Closing ser (finished)几分钟后,一个格式良好的JSON Lines 文件 torrents.jl 就生成了,包含了我们需要的信息。相反,会得到这样的输出:scrapy crawl zipru -o torrents.jl动判断yield 产出的是新的请求还是数据信息。)。替换为scrapy.core.engine DEBUG: Crawled (200) (referer: None)scrapy.downloadermidd
11、lewares.redirect DEBUG: Redirecting (302) to GETfrom scrapy.core.engine DEBUG: Crawled (200) 0:return self.solve_captcha(captcha_images0)你可以把这个会话当作一个浏览器,它会做所有浏览器通常所做的事(如获取外部资源,获取)。可以在选项卡中导航到新的 URL,点击按钮,输入文本以及做其它各类事务。Scrapy 支持请求和项目处理的并发,但响应的处理是单线程的。这意味着可以使用这个单独的 dryscr会话,而不用担心线程安全。def init (self, set
12、tings): super(). init (settings)# start xvfb to support headless scra if linux in sys.platform:dryscr.start_xvfb()self.dryscr_ses=dryscr.Ses(base_url=)这里处理了在浏览器时可能遇到的各种情况,并且做了一个正常人 类会做出的操作。任何时刻采取的行动取决于当前的页面,代码以一种优雅 的方式顺序处理变化的情况。# 点击可能存在的重试retry_links = self.dryscr_ses.css(ahref *= threat_defense) if
13、 len(retry_links) 0:return self.bypass_threat_defense(retry_links0.get_attr(href)# 否则的话,是在一个重定向页面上,等待重定向后再次尝试self.wait_for_redirect()return self.bypass_threat_defense()def wait_for_redirect(self, url = None, wait = 0.1, timeout=10): url = url or self.dryscr_ses.url()for i in range(timeout/wait): tim
14、e.sleep(wait)# 如果 url 发生变化则返回if self.dryscr_ses.url() != url: return self.dryscr_ses.url()logger.error(fMaybe self.dryscr_ses.url() isnt a redirectURL?)raise Exception(Timed out on the zipru redirect page.)def solve_captcha(self, img, width=1280, height=800): # 对当前页面截图self.dryscr_ses.set_viewport_si
15、ze(width, height)filename = tempfile.mktemp(.png)self.dryscr_ses.render(filename, width, height)# 注入javascript 代码来找到的边界js = .querySelector(imgsrc *= captcha).getBoundingCntRect()rect = self.dryscr_ses.eval_script(js)box = (rectleft),(recttop),(rectright), (rectbottom)# 解决截图中的image = Image.open(filen
16、ame) os.unlink(filename) captcha_image = image.crox)captcha = pytesseract.image_to_string(captcha_image) logger.debug(fSolved the Zipru captcha: captcha)最后一个谜题是解决。有不少解决服务的API 供你在紧要关头使用,但是这里的足够简单可以用OCR 来解决它。使用 pytesseract 做字符识别,最终可以添加solve_captcha(img)方法来完善的 bypass_threat_defense()。可以看到,如果失败,会回到 bypa
17、ss_threat_defense()。这样我们拥有多次尝试的机会,直到成功一次。看起来的爬虫应该成功了,它陷入了无限循环中:# 提交结果input = self.dryscr_ses.xpath(/inputid = solve_string)0input.set(captcha)button = self.dryscr_ses.xpath(/buttonid = button_submit)0url = self.dryscr_ses.url() button.click()# 如果被重定向到一个防御的 URL,重试if self.is_threat_defense_url(self.wa
18、it_for_redirect(url): return self.bypass_threat_defense()# 否则就可以返回当前的s的字典s = for_string in self.dryscr_ses.s(): if =zipru.to in_string:key, value =_string.split(;)0.split(=) skey = valuereturns看起来的中间件至少成功解决了,然后重新发起请求。问题在于新的请求重又触发了防御机制。我一开以为bug 在与添加s,可再三检查无果。这是另一个“唯一可能不同的东西是请求头”的情况。 包含了完整的原始测是,其中一个加密
19、的请求头的哈希值,如果两次请求头不匹配,将触发防御机制。这里的意图可能是防止直接将浏览器的s到爬虫中,但也只是增加了点小麻烦。所以让在 zipru_scrr/settings.py 明确指定的请求头:DEFAULT_REQUEST_HEADERS = Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8,User-Agent: USER_AGENT,Connection: Keep-Alive, Accept-Encoding: gzip, deflate,Scrapy 和dryscr的请求头显然都绕过了
20、触发403的第一层过滤器,因为没有得到任何 403 响应。但这肯定是因为某种请求头的差异造成。猜scrapy.core.engine DEBUG: Crawled (200) (referer: None)zipru_scrr.middlewares DEBUG: Zipru threat defense triggered forzipru_scrr.middlewares DEBUG: Solved the Zipru captcha: UJM39 zipru_scrr.middlewares DEBUG: Zipru threat defense triggered forzipru_scrr.middlewares DEBUG: Solved the Zipru captcha: TQ9OG zipru_scrr.middlewares DEBUG: Zipru threat defense triggered forzipru_scrr.middlewares DEBUG: Solved the Zipru captcha: KH9A8.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学交通安全整治的工作总结范文(5篇)
- 医生个人主要事迹500字(5篇)
- 《客户群体和消费心》课件
- 《临床麻醉学英》课件
- 物联网(IoT)安全策略-洞察分析
- 艺术电商平台物流配送优化研究-洞察分析
- 细胞凋亡分子机制-洞察分析
- 疑病症跨文化研究-洞察分析
- 医院医保人员工作总结(7篇)
- 药物干预与运动功能恢复-洞察分析
- 医院组织药品集中采购和使用工作制度及应急预案
- 富士康公司组织架构及部门职责
- 库区倒罐作业操作规程
- 二年级下册乘除法口算题
- 中国地图矢量图课件
- 新版现代西班牙语第二册课后答案
- 热电厂管理提升专题方案
- 2022年第一学期田径社团活动计划
- 幕墙计算表格(自动版)
- 2022年广东省广州市海珠区八年级上学期期末语文试卷
- 第9课台历的设计
评论
0/150
提交评论