scrapy中的CrawlSpider

CrawlSpider爬虫的创建

1. 创建项目

scrapy startproject 项目名

例如:
scrapy startproject circ

2. 创建CrawlSpider 爬虫

scrapy genspider -t crawl 爬虫名 网站名

例如:

scrapy genspider -t crawl bjh bxjg.circ.gov.cn

3.项目结构

 

bjy.py 爬虫文件中代码结构如下:

    在rule中的参数:

    1. linkExtractor连接提取器,提取url地址
     2. callback 提取出来的url地址的response 会交给callback处理
     3. follow 当前url地址的响应是否重新进行rules来提取url地址
  注意点:
    在爬虫文件中,以前的parse方法,在CrawlSpider爬虫类中是有特殊的功能,不能定义。
# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule


class BjhSpider(CrawlSpider):
    name = 'bjh'
    allowed_domains = ['bxjg.circ.gov.cn']
    start_urls = ['http://bxjg.circ.gov.cn/web/site0/tab5240/module14430/page1.htm']
   # allow 是正则规则
# linkExtractor连接提取器,提取url地址 # callback 提取出来的url地址的response 会交给callback处理 #follow 当前url地址的响应是否重新进行rules来提取url地址

rules = ( Rule(LinkExtractor(allow=r'Items/'), callback='parse_item', follow=True), ) def parse_item(self, response): item = {} #item['domain_id'] = response.xpath('//input[@id="sid"]/@value').get() #item['name'] = response.xpath('//div[@id="name"]').get() #item['description'] = response.xpath('//div[@id="description"]').get() return item

案例 一:

提取 起始url地址为:http://bxjg.circ.gov.cn/web/site0/tab5240/module14430/page1.htm

需求:

 步骤:

1 .该url地址的响应是否有我们想要的内容,经分析有

2.提取url地址

)1.提取详情页的url地址的正则:

allow=r'/web/site0/tab5240/info\d+/.htm'     #    \d+ 匹配数字  其后的/ 表示转义,因为后面有一个点号

)2. 提取页码url 的正则:

allow=r'/web/site0/tab5240/module14430/page\d+/.htm’   # 同理  \d+ 表示匹配数字,其后的/ 表示转义

 

想要的数据:详情页的标题和发布时间

标题:正则提取

 

分布时间:正则 提取 

 

爬虫代码:

# -*- coding: utf-8 -*-
import scrapy
import re
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule


class BjhSpider(CrawlSpider):
    name = 'bjh'
    allowed_domains = ['bxjg.circ.gov.cn']
    start_urls = ['http://bxjg.circ.gov.cn/web/site0/tab5240/module14430/page1.htm']

    # linkExtractor连接提取器,提取url地址
    # callback 提取出来的url地址的response 会交给callback处理
    #follow 当前url地址的响应是否重新进行rules来提取url地址
    rules = (
        Rule(LinkExtractor(allow=r'/web/site0/tab5240/info\d+/.htm'), callback='parse_item'),
        Rule(LinkExtractor(allow=r'/web/site0/tab5240/module14430/page\d+/.htm'), follow=True),
    )

    def parse_item(self, response):
        
        item = {}
        item['title'] = re.findall("<!--TitleStart-->(.*?)<!--TitleEnd-->",response.body.decode())[0]
        item['pub_time'] = re.findall("发布时间:(20\d{2}-\d{2}-\d{2})",response.body.decode())[0]

        print(item)

 

总结:

crawlspider的使用
- 常见爬虫 scrapy genspider -t crawl 爬虫名 allow_domain
- 指定start_url,对应的响应会进过rules提取url地址
- 完善rules,添加Rule ` Rule(LinkExtractor(allow=r'/web/site0/tab5240/info\d+\.htm'), callback='parse_item'),`

- 注意点:
- url地址不完整,crawlspider会自动补充完整之后在请求
- parse函数不能定义,他有特殊的功能需要实现
- callback:连接提取器提取出来的url地址对应的响应交给他处理
- follow:连接提取器提取出来的url地址对应的响应是否继续被rules来过滤

 

posted @ 2023-10-26 22:36  冰底熊  阅读(13)  评论(0编辑  收藏  举报