python3 scrapy 进阶(一)Rule , Link Extractors 的使用

之前一直没有使用到Rule , Link Extractors,最近在读scrapy-redis给的example的时候遇到了,才发现自己之前都没有用过。Rule , Link Extractors多用于全站的爬取,学习一下。
Rule
Rule是在定义抽取链接的规则

class scrapy.contrib.spiders.
Rule
(link_extractor,callback=None,cb_kwargs=None,follow=None,process_links=None,process_request=None)
  1. link_extractor 是一个Link Extractor对象。 是从response中提取链接的方式。在下面详细解释
  2. follow是一个布尔值,指定了根据该规则从response提取的链接是否需要跟进。 如果callback 为None,follow 默认设置为True,否则默认为False。
    当follow为True时,爬虫会从获取的response中取出符合规则的url,再次进行爬取,如果这次爬取的response中还存在符合规则的url,则再次爬取,无限循环,直到不存在符合规则的url。
    当follow为False是,爬虫只从start_urls 的response中取出符合规则的url,并请求。

具体使用可以看下面的例子

———————————-分割线———————————-
Link Extractors
官方解释是:

Link Extractors 是用于从网页(scrapy.http.Response )中抽取会被follow的链接的对象。

简单的理解就是:

用于从网页返回的response里抽取url,用以进行之后的操作。

我们用豆瓣top250写一个小例子

from scrapy.spiders.crawl import Rule, CrawlSpider
from scrapy.linkextractors import LinkExtractor

class DoubanSpider(CrawlSpider):
    name = "test"
    allowed_domains = ["book.douban.com"]
    start_urls = ['https://book.douban.com/top250']

    rules = (
        Rule(LinkExtractor(allow=('subject/\d+/$',)),callback='parse_items'),
    )

    def parse_items(self, response):
        pass

需要注意的点:

  1. import
  2. DoubanSpider继承的是CrawlSpider,并不是之前的scrapy.Spider
  3. Rule中使用的就是 Link Extractors

运行爬虫,效果如下:
这里写图片描述
可见爬取了很多url,这些url是怎么获得的呢?
就是Link Extractors 提取出来的。
我们在上面的rule中定义了Link Extractors,LinkExtractors接收的一个参数是allow=(‘subject/\d+/$’,) ,是一个正则表达式。
运行流程是

1.scrapy 请求 start_urls , 获取到response
2.使用LinkExtractors中allow的内容去匹配response,获取到url
3.请求这个url , response交给,callback指向的方法处理

Scrapy默认提供2种可用的 Link Extractor,可以通过实现一个简单的接口创建自己定制的Link Extractor来满足需求。
如果不自定义的话,默认的link extractor 是 LinkExtractor ,其实就是 LxmlLinkExtractor:
LinkExtractor的参数有:

class scrapy.contrib.linkextractors.lxmlhtml.LxmlLinkExtractor(allow=(), deny=(), allow_domains=(), deny_domains=(), deny_extensions=None, restrict_xpaths=(), tags=('a', 'area'), attrs=('href', ), canonicalize=True, unique=True, process_value=None)
  1. allow
    一个正则表达式(或一个正则表达式的列表),即要提取的url。如果没有(或空),它将匹配所有链接。
  2. deny
    一个正则表达式(或一个正则表达式的列表),即不需要提取的url。它优先于允许参数。如果没有(或空),它不会排除任何链接。
  3. allow_domains
    允许的域名
  4. deny_domains
    不允许的域名
  5. deny_extensions
    不允许的扩展名(参考http://www.xuebuyuan.com/296698.html
  6. restrict_xpaths
    是XPath(或XPath的列表),该XPath定义了应该从何处提取链接的响应区域。如果给定,只有那些XPath选择的文本将被扫描到链接。
  7. tags
    在提取链接时要考虑的标签或标签列表
    默认为(‘a’, ‘area’).
  8. attrs
    在查找提取链接时应该考虑的属性或属性列表(仅针对标记参数中指定的标记)。默认为(“href”)
  9. canonicalize
    每个url(使用scrapy.utils.url.canonicalize_url)提取规范化。默认值为True。
  10. unique
    是否应将重复过滤应用于提取的链接。
  11. process_value
    它接收来自扫描标签和属性提取每个值, 可以修改该值, 并返回一个新的, 或返回 None

以上参考链接http://scrapy-chs.readthedocs.io/zh_CN/latest/topics/link-extractors.html

以上是follow没有设置(默认为False的情况),在爬取到25个url的时候程序终止了。而如果将follow设置为True,将程序改成如下:

from scrapy.spiders.crawl import Rule, CrawlSpider
from scrapy.linkextractors import LinkExtractor

class DoubanSpider(CrawlSpider):
    name = "test"
    allowed_domains = ["book.douban.com"]
    start_urls = ['https://book.douban.com/top250']

    rules = (
        Rule(LinkExtractor(allow=('subject/\d+/$',)),callback='parse_items',follow=True),
    )

    def parse_items(self, response):
        pass

再次运行爬虫,发现爬虫(不被反爬的话)会跑很久不停下。因为在页面中有这样的地方:
这里写图片描述
他们的url也符合规则,就会被不断的爬下来。

项目代码地址:https://github.com/dangsh/hive/tree/master/scrapySpider/ruleTest

### 使用 Scrapy 框架进行网页抓取 Scrapy 是用 Python 实现的个为了采集网站数据、提取结构性数据而编写的应用框架,常应用于包括数据挖掘,信息处理或存储历史数据等系列的程序中[^1]。该框架专为高效抓取和处理网络数据而设计。 #### 安装 Scrapy 要开始使用 Scrapy,需先安装此库: ```bash pip install scrapy ``` #### 创建 Scrapy 项目 初始化个新的 Scrapy 项目可以通过命令行完成: ```bash scrapy startproject myproject ``` 这将在当前工作目录下创建名为 `myproject` 的文件夹结构,其中包含了多个重要组件。 #### 编写 SpiderSpiders 是定义如何爬取特定站点(或组站点)的组规则。下面是个基于给定模板修改后的简单例子,用于抓取名人实时排行榜页面的数据[^3]: ```python import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule class CelebritySpider(CrawlSpider): name = 'celebrity' allowed_domains = ['phb123.com'] start_urls = [ 'https://www.phb123.com/renwu/fuhao/shishi_1.html', ] rules = ( Rule( LinkExtractor(allow=r'shishi_\d+.html'), callback='parse_item', follow=True, ), ) def parse_item(self, response): item = {} # 假设我们想要获取每个名人的名字作为实例属性 item['name'] = response.css('div.name::text').get() yield item ``` 上述代码片段展示了如何配置链接提取器来匹配 URL 并调用解析方法;同时也说明了怎样利用 CSS Selectors 来定位 HTML 中的具体元素并将其保存到字典对象里以便后续操作。 #### 设置全局参数 对于更复杂的场景,在项目的根目录下的 `settings.py` 文件可以用来调整各种行为选项,比如下载延迟时间、并发请求数量等设置[^4]。 #### 处理抓取下来的数据 抓取得到的信息通常还需要进步清洗与转换才能被有效利用。为此可以在 `items.py` 和 `pipelines.py` 中分别定义数据模型以及相应的预处理器逻辑。 #### 执行爬虫任务 最后步就是启动爬虫执行实际的任务了。进入终端输入如下指令即可运行刚才编写的 spider: ```bash scrapy crawl celebrity ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值