首页 > 编程语言 >18--Scrapy04--CrawlSpider、源码模板文件

18--Scrapy04--CrawlSpider、源码模板文件

时间:2024-04-24 15:55:42浏览次数:25  
标签:提取 -- 18 parse scrapy 源码 LinkExtractor CrawlSpider 链接

Scrapy04--CrawlSpider、源码模板文件

案例:汽车之家,全站抓取二手车的信息 来区分SpiderCrawlSpider

注意:汽车之家的访问频率 要控制一下, 要不然会跳验证

settings.py 中设置 DOWNLOAD_DELAY = 3

一、常规Spider

# spiders/Ershou.py
import scrapy
from scrapy.linkextractors import LinkExtractor

class ErshouSpider(scrapy.Spider):
    name = 'ershou'
    allowed_domains = ['che168.com']
    start_urls = ['https://www.che168.com/china/a0_0msdgscncgpi1ltocsp1exx0/']

    def parse(self, resp, **kwargs):
        # print(resp.text)
        # 链接提取器:详情页
        le = LinkExtractor(restrict_xpaths=("//ul[@class='viewlist_ul']/li/a",), deny_domains=("topicm.che168.com",) )
        links = le.extract_links(resp)
        
        for link in links:
            yield scrapy.Request(
                url=link.url,
                callback=self.parse_detail
            )
            
        # 链接提取器:翻页
        le2 = LinkExtractor(restrict_xpaths=("//div[@id='listpagination']/a",))
        pages = le2.extract_links(resp)
        for page in pages:
            yield scrapy.Request(url=page.url, callback=self.parse)

    def parse_detail(self, resp, **kwargs):
        title = resp.xpath('/html/body/div[5]/div[2]/h3/text()').extract_first()
        print(title)

1.1 链接提取器

LinkExtractor:链接提取器 类,可以非常方便从一个响应页面中,提取到url链接,只需要提前定义好规则即可.

### 1 构建 链接提取器类的 对象
from scrapy.linkextractors import LinkExtractor

le = LinkExtractor(参数)  # 参数值 都是元祖形式
    allow    # 接收一堆正则表达式, 提取出符合该正则的链接
    deny     # 接收一堆正则表达式, 剔除符合该正则的链接
    
    allow_domains    # 接收一堆域名, 符合该域名的链接被提取
    deny_domains     # 接收一堆域名, 剔除不符合该域名的链接
    
    restrict_xpaths  # 接收一堆xpath, 提取符合要求xpath的链接
    restrict_css     # 接收一堆css选择器, 提取符合要求的css选择器的链接
    
    tags     # 设置从哪个标签中提取链接  默认(a,area)
    attrs    # 设置从标签的哪个属性中提取链接  默认 (href, )
    
    其他参数   # 点击源码 自己看
    
    
    
### 2 根据响应对象  提取链接  
links = 对象.extract_links(响应对象)  # 且 自动将链接拼接完整了,不需要 response.urljoin(url)
    
    # .extract_links() 返回的是links
    一堆 Link对象(url='',text='', nofollow=False) 的列表


    
### 3 eg:
le = LinkExtractor(restrict_xpaths=("//ul[@class='viewlist_ul']/li/a",), deny_domains=("topicm.che168.com",) )

links = le.extract_links(resp)

    
# 注意:
在提取到的url中, 是有重复的内容的  但scrapy会自动过滤掉重复的url请求

二、CrawlSpider

2.1 工作流程

# 工作流程:
前期(构建起始页的请求对象) 和普通的spider是一致的
在第一次请求回来之后,会自动的将返回的response
按照rules中,多个订制的规则(Rule) 来匹配
进行提取链接,并进一步按照 规则的 callback参数 回调 进行具体的处理


# 形式
rules = (
        Rule(LinkExtractor(restrict_xpaths=('xxx',)), follow=True),  # 分页规则
        Rule(LinkExtractor(restrict_xpaths=('yyy',)), callback='parse_item', follow=False), # 详情页规则
    )


# 规则(Rule)的参数
1.第一个参数 link_extractor
参数值是LinkExtractor对象  # 链接提取器对象

2.callback='解析函数名'  # 注意:和普通spider的区别是 该参数值是字符串形式 'parse_item' ,不再是函数地址 self.parse

3.follow=True | False 
  指的是按照 当前规则(Rule) 提取后的链接,发送链接请求后的 响应内容
  是否还使用 当前所有规则(rules) 提取链接,并继续发送 链接的请求对象

  相当于 常规spider中 在parse中继续 scrapy.request(xxx, callback=self.parse)

2.2 抓取汽车之家

在scrapy中提供了CrawlSpider,可用来完成全站数据抓取

注意:和以往的spider不同:该爬虫需要用到crawl的模板,来创建爬虫(spider)

  1. 创建项目
# 1.创建项目
scrapy startproject qichezhijia

# 2.进入项目
cd qichezhijia

# 3.创建爬虫  使用CrawlSpider  -t 指定spider的模板名  eg:crawl ---> CrawlSpider
# scrapy genspider -t spider模板名 spider名 域名

scrapy genspider -t crawl ershouche che168.com 
  1. 修改spider中的rules、回调函数
# spiders/Ershouche.py
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule      # 使用crawl模板  会自动导入到这些


class ErshoucheSpider(CrawlSpider):
    name = 'ershouche'
    allowed_domains = ['che168.com', 'autohome.com.cn']
    start_urls = ['https://www.che168.com/beijing/a0_0msdgscncgpi1ltocsp1exx0/']

    # 分页规则
    le1 = LinkExtractor(restrict_xpaths=("//div[@id='listpagination']/a",))
    
    # 详情页规则
    le2 = LinkExtractor(restrict_xpaths=("//ul[@class='viewlist_ul']/li/a",), deny_domains=("topicm.che168.com",) )
    

    
    rules = (
        Rule(le1, follow=True),  # 分页规则   并响应内容 继续按照rules的所有规则 提取链接
        
        Rule(le2, callback='parse_item', follow=False), # 详情页规则  并响应内容 不再继续按照rules的所有规则 提取链接了
    )

    def parse_item(self, response):
        print(response.url)
    
    
    # 注意:
    该位置没有了parse函数了,上面一、常规spider中的parse函数的逻辑,都是集成到 CrawlSpider类中了。

三、源码模板文件

### scrapy源码的 模板文件

scrapy
  -templates
    --project             # 创建项目的模板
      ---module
        ----spiders
        __init__.py
        items.py.tmpl
        middlewares.py.tmpl
        pipelines.py.tmpl
        settings.py.tmpl   # 默认配置的模板
    
      ---scrapy.cfg

    --spiders       # 创建爬虫(spider)的模板
      basic.tmpl   # 常规spider
      crawl.tmpl   # CrawlSpider
      csvfeed.tmpl
      xmlfeed.tmpl
    
    
    
### 应用1:修改源码 scrapy/templates/project/module/settings.py.tmpl
ROBOTSTXT_OBEY = False   # 不遵守robots协议
LOG_LEVEL = 'WARNING'    # 控制台打印日志级别
DOWNLOAD_DELAY = 3       # 请求的延迟  3秒


### 应用2:将运行脚本,添加到项目模板中
scrapy/templates/project/runner.py.tmpl
    

from scrapy.cmdline import execute

if __name__ == '__main__':
    execute('scrapy crawl $name'.split())

标签:提取,--,18,parse,scrapy,源码,LinkExtractor,CrawlSpider,链接
From: https://www.cnblogs.com/Edmondhui/p/18155645

相关文章

  • PlayerSettings.WebGL.emscriptenArgs设置无效的问题
    1)PlayerSettings.WebGL.emscriptenArgs设置无效的问题2)java.lang.NoSuchMethodError的不明崩溃问题3)UE电影摄像机旋转问题4)Android设备游戏切后台后唤起,有概率变卡且黑屏这是第383篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更......
  • Spring MVC拦截器实现,记录访问请求日志
    SpringMVC拦截器实现,记录访问请求日志1.创建拦截器类并实现HandlerInterceptor拦截器packagecom.jxdinfo.hussar.sys.interceptor;importcom.jxdinfo.hussar.base.entity.UserInfo;importcom.jxdinfo.hussar.common.util.UserUtils;importcom.jxdinfo.hussar.core.util......
  • vis.js时间轴
    代码案例<!doctypehtml><html><head><title>Timeline</title><scripttype="text/javascript"src="https://unpkg.com/vis-timeline@latest/standalone/umd/vis-timeline-graph2d.min.js"></script>......
  • 银行卡归属地查询JSON
    [{"bankName":"中国邮政储蓄银行","bankCode":"PSBC","patterns":[{"reg":"^(621096|621098|622150|622151|622181|622188|622199|955100|6210......
  • 基于DE1-SOC的Nios V工程——my_first_niosv
    一、NiosV简介目前Intel推出了三款Nios®V处理器(图片来自Intel官网): (点击图可放大)  这里面功能最强的是NiosV/g,用户可根据实际需求选择对应的软核。 截图来自Nios®V嵌入式处理器设计手册:  二、开发工具下载目前Quartus22.1及以上版本都支持NiosV了,本文以......
  • 西安站开营!AI 编码助手通义灵码帮大学生“整活儿”
    如何更好地与AI为伴,做时代的先进开发者?4月17日,阿里云推出的AI编程助手通义灵码与云工开物“高校训练营”走进西安多所高校开启实操培训,结合AI辅助编程的发展背景、通义灵码的具体能力和应用实操,帮助在校大学生了解人工智能技术在编程领域的发展,利用AI辅助编码,提升学习......
  • mysql 数据库远程连接
    安装mysqlwindows的安装相对简单不做演示演示使用redhat9安装mysql:使用yum对关键字进行搜索:yumsearchmysql安装:yuminstallmysql-server启动服务:systemctlstartmysqld尝试进入mysql视图:默认没有密码输入命令:mysql然后给root赋予一个密码默认用户表存储在mysql.......
  • 西安站开营!AI 编码助手通义灵码帮大学生“整活儿”
    如何更好地与AI为伴,做时代的先进开发者?4月17日,阿里云推出的AI编程助手通义灵码与云工开物“高校训练营”走进西安多所高校开启实操培训,结合AI辅助编程的发展背景、通义灵码的具体能力和应用实操,帮助在校大学生了解人工智能技术在编程领域的发展,利用AI辅助编码,提升学习......
  • Python list的交、并、差与排序
    求list的交集、并集、差集set() 函数创建一个无序不重复元素集,通过set可方便求取list的交并差,并可去重#通过set集合>>>list1=[1,2,3]>>>list2=[2,3,4]>>>set1=set(list1)>>>set2=set(list2)>>>set1&set2#交集{2,3}>>>set1|set......
  • 如何在职场中有效管理时间和任务?好用的待办事项提醒软件
    身在职场,时间管理和任务安排是每个人都必须面对的挑战。有效的时间管理不仅能提高工作效率,还能让我们在繁忙的工作中保持清醒的头脑。那么,如何在职场中有效管理时间和任务呢?制定一个清晰的工作计划是非常必要的,这可以帮助我们明确每天需要完成的任务和目标;要合理安排时间,给每个任......