scrapy 初探(xpath)

Posted 小溪彼岸

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了scrapy 初探(xpath)相关的知识,希望对你有一定的参考价值。

1、创建项目

 scrapy startproject zwblog

zwblog目录结构:

   zwblog
      |  scrapy.cfg
      |   zwblog
            | items.py
            | pipelines.py
            | settings.py
            | __init__.py
            | spiders
                | __init__.py

zwblog目录文件:

1 scrapy.cfg: 项目到部署配置文件
2 zwblog/:项目到python模块
3 zwblog/items.py: 项目中的item文件,类似model
4 zwblog/pipelines.py: 项目中的Pipelines文件,用于文件持久化存储
5 zwblog/settings.py: 项目中的配置文件,插件的配置,pipelines的激活等
6 zwblog/spiders/: 放置spider代码,添加爬虫解析代码等

2、添加blog爬虫类

zwblog/spiders/目录下创建zwblogs_spider.py, 代码如下:

# coding:utf-8
import scrapy

# 创建一个Spider类需要继承scrapy.Spider, 并定义name, start_urls,parse
class ZwblogSpider(scrapy.Spider):
    name = 'zwblog'  # 爬虫的名称,启动爬虫时使用
    allowed_domains = ['blog.csdn.net']  # 允许的域名
    start_urls = [
        'https://blog.csdn.net/zww1984774346'
    ]

    def parse(self, response):
        # 实现网页的解析
        # 首先抽取所有的文章
        pass

3、爬虫的启动

    scrapy crawl cnblogs  # crawl cnblogs的含义就是启动名称为'cnblogs'的爬虫

4、开始解析网页

修改zwblog/spiders/zwblogs_spider.py中的parse如下:

    def parse(self, response):
        # 实现网页的解析
        # 首先抽取所有的文章
        papers = response.xpath(".//*[@class='article-item-box csdn-tracking-statistics']")
        # 从每条记录中获取数据
        for paper in papers:
            url = paper.xpath(".//*[@class='']/a/@href").extract_first()
            title = paper.xpath(".//*[@class='']/a/text()").extract()[1]
            time_path = paper.xpath(".//*[@class='info-box d-flex align-content-center']/p")
            time = time_path.xpath(".//*[@class='date']/text()").extract_first()
            content = paper.xpath(".//*[@class='content']/a/text()").extract_first()
            print(url, title, time, content)

解析结果:

4、定义item

修改zwblog/items.py内容如下:

class ZwblogItem(scrapy.Item):
    # define the fields for your item here like:
    url = scrapy.Field()
    time = scrapy.Field()
    title = scrapy.Field()
    content = scrapy.Field()

5、使用item

修改zwblog/spiders/zwblogs_spider.py中的parse如下:

    def parse(self, response):
        # 实现网页的解析
        # 首先抽取所有的文章
        papers = response.xpath(".//*[@class='article-item-box csdn-tracking-statistics']")
        # 从每条记录中获取数据
        for paper in papers:
            url = paper.xpath(".//*[@class='']/a/@href").extract_first()
            title = paper.xpath(".//*[@class='']/a/text()").extract()[1]
            time_path = paper.xpath(".//*[@class='info-box d-flex align-content-center']/p")
            time = time_path.xpath(".//*[@class='date']/text()").extract_first()
            content = paper.xpath(".//*[@class='content']/a/text()").extract_first()
            from zwblog.items import ZwblogItem
            item = ZwblogItem(url=url, title=title, time=time, content=content)
            yield item

使用item解析的结果如下:

6、数据持久化

修改zwblog/pipelines.py

import json
from scrapy.exceptions import DropItem

class ZwblogPipeline(object):
    def __init__(self):
        self.file = open('papers.json', 'w')

    '''
        每条记录的存储
        定制完Item Pipeline是无法工作的, 需要进行激活,需要启用一个Item Pipeline组件,将它的类添加到settings.py中的ITEM_PIPELINES中
        ITEM_PIPELINES= 
            'cnblogSpider.pipelines.CnblogspiderPipeline': 300, 300表示执行顺序的优先级,执行顺序从低到高
        
    '''
    def process_item(self, item, spider):
        if item['title']:
            line = json.dumps(dict(item)) + '\\n'
            self.file.write(line)
            return item
        else:
            raise DropItem("Missing title in %s" % item)

7、激活数据持久化

修改zwblog/settings.py

ITEM_PIPELINES = 
   'zwblog.pipelines.ZwblogPipeline': 300,

数据持久化结果:

以上是关于scrapy 初探(xpath)的主要内容,如果未能解决你的问题,请参考以下文章

scrapy的Xpath表达式总结

Python爬虫 ---scrapy框架初探及实战

python之scrapy初探

Scrapy xpath在scrapy shell中返回空列表

高级爬虫( 二):Scrapy爬虫框架初探

Scrapy/Python/XPath - 如何从数据中提取数据?