您的位置:首页 > 其它

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

2019-03-04 17:48 411 查看

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

顺利的话,屏幕上会看到打印爬取结果,如下图所示:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: