需求

  1. 给定爬虫起始地址,爬行路径,获得目标页的指定内容
  2. 约定路径 起点首页 --> (历史)频道 --> 小说info页–> 章节详情起始页 --> 作者中心 --> 大神之光
  3. 路径中的每个页面html结构都不同

分析

  1. 通用爬虫,写规则,用链接抽取器
  2. 为便于演示,只展示起点与终点页指定内容,中间路径以爬虫引擎debug信息展示

准备

  • scrapy 1.6
  • SelectorGadget 类似消消乐式浏览器扩展工具,点击消除颜色块,生成css或xapth表达式

代码

# -*- coding: utf-8 -*-
import scrapy
from scrapy.spiders.crawl import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor# item填充器
from scrapy.loader import ItemLoader
from scrapy.loader.processors import Join, MapCompose, TakeFirst"""
爬虫深度测试
关注点在deep_max
"""def q(url):print('提取的链接%s' % url)return urldef l(links):for link in links:print(link)return linksclass QdSpider(CrawlSpider):name = 'qd'allowed_domains = ['qidian.com']start_urls = ['https://www.qidian.com/']rules = (Rule(LinkExtractor(# 允许爬虫深入的页面,每个响应页面只提取一个页面链接# 路径 历史频道 -> 选择特定的info ->章节->作者->大神之光 五个页面,至少5个深度allow=(r'(lishi)$', r'(info)\/(\d+)$', r'(chapter)/',r'(authorIndex)', r'author/light/(\d+)$'),# 规则不通过,则会中断后续链接提取# deny=('chapter/(.*?)$',),# 从爬虫响应页面指定区域抽取,为便于观察每个页面只爬取一个链接restrict_css=(# 首页响应提取历史链接'.even:nth-child(8)',# 历史频道响应页面info链接'.sort-list h4 a',# info页面提取免费试读(章节)链接'#readBtn ',),# 用xapth提取//协议开头的a 链接,restrict_css 不能提取诸如href="//me.qidian.com/..."这样的链接restrict_xpaths=(# 章节页面提取作者家链接'//h2//a',# 提取作者页的大神之光链接'//div[@class="author-sidebar-more"]/a[@class="blue"]'),# process_value=q, 回调参数是提取的url字符串),# 决定爬虫是否在符合规则的页面接着爬follow=True,# 可调用对象callback='parse_light',# 回调参数是个Link对象# process_links=l),)def parse_start_url(self, response):# 起始地址解析,没有回调的scrapy蜘蛛(crawled)响应交给了parse方法yield {'nav_home': response.css('.nav-li a::text').extract(),'info': response.css('#notice h3 a::text').get()}def parse_light(self, response):# 每次 Crawled (200)地址都会被规则过一遍,通过者入此# self.log('[to...大神之光]%s...' % response.url)l_light = response.css('td:nth-child(1) .dark::text').extract()if len(l_light) > 0:return {'light': l_light}

执行

  • 在项目目录执行
scrapy crawl  qd

效果


2019-05-29 19:50:04 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.qidian.com/> (referer: None)
2019-05-29 19:50:04 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.qidian.com/>
{'nav_home': ['全部作品', '排行', '完本', '免费', '作家专区', '客户端'], 'info': '党员作家班结业'}
2019-05-29 19:50:04 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.qidian.com/lishi> (referer: https://www.qidian.com/)
2019-05-29 19:50:04 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://book.qidian.com/info/1012237441> (referer: https://www.qidian.com/)
2019-05-29 19:50:05 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://book.qidian.com/info/1011705052> (referer: https://www.qidian.com/lishi)
2019-05-29 19:50:05 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://read.qidian.com/chapter/M-D2AI2m8IBdi5-cWpsVtA2/eSlFKP1Chzg1> (referer: https://book.qidian.com/info/1012237441)
2019-05-29 19:50:05 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://read.qidian.com/chapter/rD2MpxrmEaLv7_WH3wfEdQ2/eSlFKP1Chzg1> (referer: https://book.qidian.com/info/1011705052)
2019-05-29 19:50:05 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (302) to <GET https://my.qidian.com/author/3228548> from <GET https://me.qidian.com/authorIndex.aspx?id=3228548>
2019-05-29 19:50:05 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (302) to <GET https://my.qidian.com/author/2438700> from <GET https://me.qidian.com/authorIndex.aspx?id=2438700>
2019-05-29 19:50:05 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://my.qidian.com/author/3228548> (referer: https://read.qidian.com/chapter/M-D2AI2m8IBdi5-cWpsVtA2/eSlFKP1Chzg1)
2019-05-29 19:50:06 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://my.qidian.com/author/2438700> (referer: https://read.qidian.com/chapter/rD2MpxrmEaLv7_WH3wfEdQ2/eSlFKP1Chzg1)
2019-05-29 19:50:06 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://my.qidian.com/author/light/3228548> (referer: https://my.qidian.com/author/3228548)
2019-05-29 19:50:06 [scrapy.core.scraper] DEBUG: Scraped from <200 https://my.qidian.com/author/light/3228548>
{'light': ['秋風夜影', 'milanmack', '谜月', '猿人阿兴', '猿人阿兴']}
2019-05-29 19:50:06 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://my.qidian.com/author/light/2438700> (referer: https://my.qidian.com/author/2438700)
2019-05-29 19:50:06 [scrapy.core.scraper] DEBUG: Scraped from <200 https://my.qidian.com/author/light/2438700>
{'light': ['秋風夜影', 'milanmack', '谜月', '猿人阿兴', '猿人阿兴']}
2019-05-29 19:50:06 [scrapy.core.engine] INFO: Closing spider (finished)

scrapy 通用爬虫

  • 流程

    • 一个不停从Scheduler中获取请求,发起,下载,处理,响应的过程
    • request --> download --> response
    • Spider <-- spider Middlewares --> Engine <-- Downloader Middlewares --> Downloader
    • Engine <---> Engine Scheduler
    • Engine -- processed items --> item Pipelines
  • 概念
    • Spider 页面解析回调 接收response对象,返回 items,requests,None,dict或baseRequest对象
    • 源请求地址不要在item填充阶段修改,所有对请求的修改放在中间件内进行
    • windows路径在linux下表示,要加盘符 如 'D:/code-base/python/crawl/bigPhoto'
    • scrapy.requset 对象发起的请求,未指定回调函数,则会进入蜘蛛的parse默认回调
    • Rule
      • Rule 对爬虫获取的响应页面进行链接分析

        • 若没有指定规则处理器(规则回调参数),则默认交给parse处理
        • 在debug中表现出来的就是对referer页的进行规则分析,若refer为None,则认为对downloader的start_url页面进行链接分析
      • follow布尔值 决定是否对符合规则的页面进一步爬取,即跟进链接分析
        • 通常规则参数没有回调,则为true, 默认为false
        • follow本质是否允许爬虫对规则回调的响应页面进行继续爬取
      • 规则回调生效条件
        • 提取的链接符合规则要求,包括链接处理,过滤
        • 需要爬虫爬过后的响应response,且该响应没有被禁止爬取,即follow为True
        • 使用规则的页面,是爬虫提请请求,由引擎调度下载器,下载器下完后返回的响应页面
          • 在debug看来,就是referer页
        • response.follow 会将response页作为referer页
      • 核心
        • 规则使用对象 对爬虫抓取页面 response响应 的分析处理
        • 是否对符合规则的页面进行链接分析(爬取),表现为Rule的follow参数,默认为false
        • 应用规则的爬虫响应页从哪来?
          • 起点start_url
          • 规则参数follow为True,所在的提取器得到的合规链接响应,(决定爬虫是否接着爬虫)
          • 表现: follow为True,所得到的链接会被所有规则作为响应源,作新一轮规则分析
        • 流程
          • 爬虫响应 --> 逐一应用规则 – 对follow=True所产生新的response->进行新一轮规则应用
          • 爬取 --> 响应 --> 规则分析 --> 处理器分发 --> 未指定则交给parse默认方法
        • 关键问题
          • 从哪儿爬? – 从爬虫响应页
          • 要不要继续爬? – follow参数
          • 最大deep_max问题 从起始页开始(不包含),起始->A页->B页 至少深度为2
      • 常见问题
        • 提取的链接有重定向,或重新拼接(通过js)成其它目标链接的痕迹,导致直接访问无响应,不能进行下一步follow处理
        • scrapy的css选择器不支持//开发的链接提取,建议链接提取器使用a标签

scrapy 用爬虫规则指定爬行轨迹自动抓取相关推荐

  1. 什么是网络爬虫?它是如何工作的以及如何自动抓取

    网络爬虫 是了解 Internet 工作原理的基本知识.如果打算将来进行网络营销或销售,或者进行网络数据相关工作的话,就一定要接触到网络爬虫. 文章目录 网络爬虫 什么是网络爬虫? 什么是网络爬虫机器 ...

  2. Python+Selenium自动搜索基金业协会指定企业名单,抓取指定信息并保存到数据库...

    Python+Selenium自动搜索基金业协会指定企业名单,抓取指定信息并保存到数据库.网址https://gs.amac.org.cn/amac-infodisc/res/pof/manager/ ...

  3. [Python从零到壹] 四.网络爬虫之入门基础及正则表达式抓取博客案例

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  4. c#使用正则表达式获取TR中的多个TD_[Python从零到壹] 四.网络爬虫之入门基础及正则表达式抓取博客案例...

    首先祝大家中秋节和国庆节快乐,欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都 ...

  5. 亚马逊标题自动抓取_15分钟内开始使用Amazon Web Services和全自动资源调配

    亚马逊标题自动抓取 在等待一个新项目时,我想学习一些有用的东西. 而且由于在许多项目中我们需要评估和测试正在开发的应用程序的性能,而很少有足够的硬件来生成实际负载,因此我决定学习更多有关按需在云中按需 ...

  6. 我是如何白嫖 Github 服务器自动抓取每日必应壁纸的?

    如何使用 Github 服务器自动抓取必应搜索的每日壁纸呢? 如果你访问过必应搜索网站,那么你一定会被搜索页面的壁纸吸引,必应搜索的壁纸每日不同,自动更换,十分精美.这篇文章会介绍如何一步步分析出必应 ...

  7. 雪球python爬虫炒股_如何使用 Python 抓取雪球网页?

    我想使用beautifulsoup或者其他的python包 抓取 雪球网页上面的一些组合,因为雪球网的组合持仓变动的时候,雪球网不会给提示,比如说,我想抓取这个http://xueqiu.com/P/ ...

  8. 如何使用 Github Actions 自动抓取每日必应壁纸?

    Hello world : ) 微信搜「 程序猿阿朗 」.点赞再看,动力无限. 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章. 如何 ...

  9. 利用 Python 自动抓取微博热搜,并定时发送至邮箱

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 夜阑卧听风吹雨,铁马冰河入梦来. ...

最新文章

  1. 如何促使团队紧密协作
  2. bzoj1196 [HNOI2006]公路修建问题
  3. 每天一道LeetCode-----从右向左观察一棵二叉树,返回能看到的元素
  4. 怎样取消无线配置服务器,如何 去掉无线配置服务器
  5. AdapterView及其子类之二:使用ListActivity及ArrayAdapter创建列表
  6. mac微软雅黑字体_“微软雅黑”有坑,小编向你推荐免费的开源字体
  7. 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误
  8. 用两万篇论文告诉你:机器学习在过去五年中发生了什么
  9. golang 锁的使用
  10. 使用LaTeX绘制列表(有的地方称作Num Item)
  11. SpringCloud SpringBoot mybatis分布式微服务云架构开发Web应用
  12. div背景图自适应占满
  13. 使用多进程、多线程、gevent完成http服务器
  14. NC21499-今天,你惹对象生气了吗(dfs)
  15. 计算机蓝屏无法启动不了系统怎么办,电脑蓝屏重启开不了机怎么回事_电脑蓝屏之后启动不了的处理办法-系统城...
  16. 深眸分享——一文看懂倍频器的原理及其应用
  17. T100学习笔记 - Genero FGL
  18. Linux signal捕获
  19. 在html中写响应式布局的代码,CSS实现响应式布局的方法
  20. linux系统下u盘变成只读模式如何修改

热门文章

  1. MySQL Workbench报错说 seems to be a different OS
  2. 手机怎么更改html打开方式,安卓如何更改文件打开方式?
  3. 最好的5个电脑上的epub阅读器
  4. Unity中抛物线的实现
  5. 来着QQ邮箱的垃圾网页分析,能力有限,没什么实际的进展
  6. Mysql-错误处理: Found option without preceding group in config file
  7. AI时代——人工智能技术图谱,它来啦(机器学习+深度学习学习路线)
  8. Processing 网格纹理制作(棋盘格)
  9. 使用Termux把Android手机变成SSH服务器
  10. msp430单片机复习内容