scrapy框架使用示例_学习笔记

scrapy框架使用学习笔记

scrapy 框架是python中最活跃、最著名、相对成熟的爬虫框架。像一个半成品的爬虫,已经为我们实现了工作队列、下载器、保存处理数据的逻辑,以及日志、异常处理等功能。使用scrapy框架更像做填空题,更多的工作是配置这个爬虫框架,针对具体要爬取的网站,编写相应的爬取规则,而诸如多线程下载、异常处理等,交给框架来实现即可。

1.scrapy框架的安装

scrapy框架安装Windows:

conda install scrapy

安装后查看是否成功安装:

scrapy version

2.scrapy框架下的项目创建

cd D:
cd py19
scrapy startproject project_name

命令行窗口创建一个爬虫项目
上述创建的新的项目spider-test在D://py19/ 路径下,它的目录结构如下:

spider-test/
      scrapy.cfg #项目配置文件,一般不用设置
      spider-test/
            __init__.py
            items.py #定义爬取什么数据
            middlewares.py #对所有发出的请求、收到的响应或者爬虫做全局性的自定义设置
            pipelines.py#处理已爬取到的数据,如:items去重,或保存数据到数据库
            settings.py #爬虫框架设置文件
            spiders/ #文件下用于存放编写的爬虫代码,即主要的爬虫逻辑在这里面定义
                 __init__.py

使用 scrapy startproject spider-test 生成爬虫项目后,命令行下有以下提示:

cd spider-test #进入爬虫项目
scrapy genspider example example.com #生成爬虫文件
#其中,example表示爬虫名字;example.com表示爬虫网址
scrapy genspider baidu baidu.com

生成爬虫文件
上面的命令执行完成后,在spiders文件夹下会生成一个名称为baidu.py的爬虫文件。

3.百度爬虫实现

假定要爬取百度首页右上角“新闻”链接的名称和它的URL。

(1)定义要爬取的数据:

items.py 是用于定义爬取数据的容器,定义要爬取哪些字段的数据,打开items.py 文件,看到如下默认代码:

import scrapy

class SpiderTestItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    pass

上述默认代码给人很好的提示,即使用类似来定义要提取的字段,此处需要提取两个字段,一个是栏目(title),另一个是栏目对应的url (title_url) ,因此将items.py的代码改成如下形式:

import scrapy

class SpiderTestItem(scrapy.Item):
    # define the fields for your item here like:
    title = scrapy.Field()
    title_url = scrapy.Field()

(2)编写爬虫文件

打开soiders文件夹下的baidu.py 爬虫文件,将看到如下代码:

import scrapy

class BaiduSpider(scrapy.Spider):
    name = 'baidu'
    allowed_domains = ['baidu.com']
    start_urls = ['https://baidu.com/']

    def parse(self, response):
          pass

上面为爬虫框架生成的爬虫文件模板,可在这个模板基础上增加具体的提取规则、解析方法等。具体修改完后的baidu.py代码如下所示:

import scrapy
from spider_test.items import SpiderTestItem #引入Item类

class BaiduSpider(scrapy.Spider):
    name = 'baidu'
    allowed_domains = ['baidu.com']
    start_urls = ['https://baidu.com/']

    def parse(self, response):
        item = SpiderTestItem() #初始化Item类的数据容器
        #提取新闻这个栏目名称
        item['title'] = response.xpath('//*[@id="u1"]/a[1]/text()').extract()[0] 
         #提取新闻这个栏目名称对应的URL
        item['title_url '] = response.xpath('//*[@id="u1"]/a[1]/@href').extract_first()
        print(item['title'])
        print(item['title_url'])
        return item

***注:***items数据容器的使用语法类似Python字典。Scrapy爬虫框架为了提取真实的原文数据,需要调用extract() 序列化提取节点为unicode字符串,这样提取出来的是全部匹配元素的列表,因此提取第一个可写为extract()[0] 或 extract_first() ,二者等价。

至此,百度Scrapy爬虫框架已编写完成。再在命令行窗口定位到项目的根目录,使用如下命令运行这个爬虫:

#scrapy crawl example
scrapy crawl  baidu

这是就运行了Scrapy百度爬虫,但是可能在屏幕上没有看到代码中的打印结果,而是发现类似Forbidden by robots.txt 这样的提示。这是因为新版本的Scrapy爬虫框架默认遵守robots协议,设置Scrapy爬虫框架的settings.py中的ROBOTSTXT_OBEY = True 为 ROBOTSTXT_OBEY = False即可。然后再次运行:scrapy crawl baidu
顺利的话,屏幕上会看到打印爬取结果,如下图所示:
百度爬取屏幕打印结果

猜你喜欢

转载自blog.csdn.net/s1164548515/article/details/88128349