51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1473|回复: 1
打印 上一主题 下一主题

Scrapy框架架构[2]

[复制链接]
  • TA的每日心情
    无聊
    2024-9-19 09:07
  • 签到天数: 11 天

    连续签到: 2 天

    [LV.3]测试连长

    跳转到指定楼层
    1#
    发表于 2019-6-17 17:34:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    完成的爬虫代码:
    • 爬虫部分代码:
      1. import scrapy
      2. from abcspider.items import QsbkItem

      3. class QsbkSpider(scrapy.Spider):
      4.      name = 'qsbk'
      5.      allowed_domains = ['qiushibaike.com']
      6.      start_urls = ['https://www.qiushibaike.com/text/']

      7.      def parse(self, response):
      8.          outerbox = response.xpath("//div[@id='content-left']/div")
      9.          items = []
      10.          for box in outerbox:
      11.              author = box.xpath(".//div[contains(@class,'author')]//h2/text()").extract_first().strip()
      12.              content = box.xpath(".//div[@class='content']/span/text()").extract_first().strip()
      13.              item = QsbkItem()
      14.              item["author"] = author
      15.              item["content"] = content
      16.              items.append(item)
      17.          return items
      复制代码

    2. items.py部分代码:
    1. import scrapy
    2. class QsbkItem(scrapy.Item):
    3.      author = scrapy.Field()
    4.      content = scrapy.Field()
    复制代码
    3. pipeline部分代码:
    1. import json

    2. class AbcspiderPipeline(object):
    3.        def __init__(self):

    4.       self.items = []

    5.      def process_item(self, item, spider):
    6.      self.items.append(dict(item))
    7.      print("="*40)
    8.      return item

    9.      def close_spider(self,spider):
    10.      with open('qsbk.json','w',encoding='utf-8') as fp:
    11.            json.dump(self.items,fp,ensure_ascii=False)
    复制代码
    运行scrapy项目:运行scrapy项目。需要在终端,进入项目所在的路径,然后scrapy crawl [爬虫名字]即可运行指定的爬虫。如果不想每次都在命令行中运行,那么可以把这个命令写在一个文件中。以后就在pycharm中执行运行这个文件就可以了。比如现在新创建一个文件叫做start.py,然后在这个文件中填入以下代码:


    1. from scrapy import cmdline

    2. cmdline.execute("scrapy crawl qsbk".split())
    复制代码
    CrawlSpider在上一个糗事百科的爬虫案例中。我们是自己在解析完整个页面后获取下一页的url,然后重新发送一个请求。有时候我们想要这样做,只要满足某个条件的url,都给我进行爬取。那么这时候我们就可以通过CrawlSpider来帮我们完成了。CrawlSpider继承自Spider,只不过是在之前的基础之上增加了新的功能,可以定义爬取的url的规则,以后scrapy碰到满足条件的url都进行爬取,而不用手动的yield Request。
    CrawlSpider爬虫:创建CrawlSpider爬虫:之前创建爬虫的方式是通过scrapy genspider [爬虫名字] [域名]的方式创建的。如果想要创建CrawlSpider爬虫,那么应该通过以下命令创建:


    1. scrapy genspider -c crawl [爬虫名字] [域名]
    复制代码
    LinkExtractors链接提取器:使用LinkExtractors可以不用程序员自己提取想要的url,然后发送请求。这些工作都可以交给LinkExtractors,他会在所有爬的页面中找到满足规则的url,实现自动的爬取。以下对LinkExtractors类做一个简单的介绍:


    1. class scrapy.linkextractors.LinkExtractor(
    2.       allow = (),
    3.       deny = (),
    4.       allow_domains = (),
    5.       deny_domains = (),
    6.       deny_extensions = None,
    7.       restrict_xpaths = (),
    8.       tags = ('a','area'),
    9.       attrs = ('href'),
    10.       canonicalize = True,
    11.       unique = True,
    12.       process_value = None
    13. )
    复制代码
    主要参数讲解:
    • allow:允许的url。所有满足这个正则表达式的url都会被提取。
    • deny:禁止的url。所有满足这个正则表达式的url都不会被提取。
    • allow_domains:允许的域名。只有在这个里面指定的域名的url才会被提取。
    • deny_domains:禁止的域名。所有在这个里面指定的域名的url都不会被提取。
    • restrict_xpaths:严格的xpath。和allow共同过滤链接。








    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-26 16:43 , Processed in 0.070052 second(s), 22 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表