Python 爬虫,scrapy,CrawlSpider,自动提取url并发送请求

CrawlSpider 爬虫可以自动匹配提取url地址并发送请求,请求前会自动将url地址补全成以http开头的完整url。

创建CrawlSpider爬虫的命令:先cd到项目目录中 ----> scrapy genspider –t crawl 爬虫名 baidu.com  

项目名/spiders/爬虫名.py(CrawlSpider爬虫,自动匹配提取url地址并发送请求):

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

# 继承的是CrawlSpider
class DemoSpider(CrawlSpider):
    name = '爬虫名'
    allowed_domains = ['baidu.com']
    start_urls = ['http://www.baidu.com']

    # 定义提取url地址的规则
    rules = (
        # LinkExtractor 链接提取器,提取url地址
        # callback 提取出来的url地址的response会交给callback处理(如果不需要处理,可以不写callback)
        # follow 提取的url地址的响应是否重新经过rules来提取新url地址(默认False)
        Rule(LinkExtractor(allow=r'/web/site0/tab5240/info\d+\.htm'), callback='parse_item'), # callback不能传递数据。 详情页的url
        Rule(LinkExtractor(allow=r'/web/site0/tab5240/module14430/page\d+\.htm'),follow=True),  # 下一页的url
        # 如果url匹配到上面的规则,就不会继续向下匹配了。
    )

    # parse函数有特殊功能,不能定义(覆盖)
    def parse_item(self, response):
        item = {}
        item["title"] = re.findall("<!--TitleStart-->(.*?)<!--TitleEnd-->",response.body.decode())[0]
        item["publish_date"] = re.findall("发布时间:(20\d{2}-\d{2}-\d{2})",response.body.decode())[0]
        print(item)
        
    #     也可以继续发送请求(可以通过meta传递数据)
    #     yield scrapy.Request(
    #         url,
    #         callback=self.parse_detail,
    #         meta = {"item":item}
    #     )
    #

猜你喜欢

转载自blog.csdn.net/houyanhua1/article/details/86552430