scrapy使用心得(入门教程)
scrapy官网:https://doc.scrapy.org/en/latest/topics/settings.html
基本上没有什么教程可以媲美官方文档的,所有的教程不过是在解读官方文档,如果有那一定是看源码。所以,如果你有耐心的话可以自己看官方文档。使用谷歌浏览器自带的谷歌翻译可以看得懂,不像python官方的文档,机翻出来基本天书。
关于各组件的功能,我觉得这个博客写的很好。可以看一下https://www.cnblogs.com/kongzhagen/p/6549053.html
安装指南
如果只是参考文档的做,绝对会报错。这个还是需要百度搜一下相关文章,他们会提供简单的安装方法。
[Scrapy初识]
(https://doc.scrapy.org/en/latest/intro/tutorial.html)
这个主要在讲解scrapy怎么爬取quotes.toscrape.com这个网站
- 首先创建项目:scrapy startproject tutorial。命令行执行,如果是Windows则是dos下执行,这条命令会创建一个scrapy文件目录。
- 目录结构先不理他,我们先在spiders目录创建一个爬虫文件,名称随意,比如就叫spider.py。
- 在spider.py写入以下内容
import scrapy
class QuotesSpider(scrapy.Spider):
name = "quotes"
def start_requests(self):
urls = [
'http://quotes.toscrape.com/page/1/',
'http://quotes.toscrape.com/page/2/',
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
page = response.url.split("/")[-2]
filename = 'quotes-%s.html' % page
with open(filename, 'wb') as f:
f.write(response.body)
self.log('Saved file %s' % filename)
4.然后,在dos窗口cd到scrapy.cfg所在的目录,输入scrapy crawl quotes。
5.这样,一个简单的使用就完成了,我们所做的只是写了一些解析网页的代码。至于怎么抓取完全由scrapy来操作。
我们来说明以下我们写的那个文件的信息。
- 文件名随意,如果整个scrapy只是抓取一个网站建议命名为spider.py。如果抓取多个网站可以用网站域名区分。
- 继承于scrapy.Spider,必须继承scrapy下的爬虫类,一般是scrapy.Spider
- name属性,爬虫的名称,运行的时候使用,比如上面的第四步命令的最后就是这个name的值
- start_requests方法,默认调用的一个方法,主要写爬虫抓取的网站
- parse方法,解析函数,接受一个response对象,这个对象是爬虫爬取网页生成的一个对象,包含网页结构。主要用于提取想要的数据
命令行工具
说一下我觉得有用的几个命令
- 创建项目:scrapy startproject baidu
- 创建爬虫:scrapy genspider spider www.baidu.com
- 运行爬虫:scrapy crawl name [-o a.json]
- 检查项目:scrapy check -l
- 访问网页:scrapy view url
- 测试提取:scrapy shell url
- 查看版本:scrapy version [-v]
这没什么需要注意的,多用几次就知道是什么意思了。测试提取是在命令行解析数据,看看你的xpath能不能提取到数据。
爬虫
前面粗略的说了一下爬虫的几个属性和方法,现在我们全面一点
- name:(属性,字符串),爬虫名称
- allowed_domains: (类属性,列表),允许爬取的域名
- start_urls: (属性,列表),默认开始爬取的URL列表
- custom_settings:(属性,字典),包含配置信息,用于覆盖setting.py里的配置。比如这个爬虫我要使用特定的头信息等。
- crawler:看起来功能强大,但只使用过crawler.settings.get获取settings.py里面的配置参数
- settings:运行此蜘蛛的配置,暂时没弄懂有什么用
- logger:(属性,怎么说呢),管理日志.使用的话self.logger.info(’’)
- from_crawler: (类方法),需要加@classmethod修饰。目前已知的作用是获取参数并传递给__init__。不清楚目的如何,为什么不直接通过crawler获取参数。
- start_requests:(方法),默认调用的一个方法。主要写爬虫爬的网站。
- parse:(方法),当存在start_urls默认调用的解析函数
- log:(方法),暂时没用过
- closed:(方法),爬虫停止时调用的一个方法,一般用于资源的关闭
以上是scrapy.Spider的一些属性和方法。还有CrawlSpider、XMLFeedSpider、CSVFeedSpider 等就不多解释了。其实有Spider就足够解决大部分爬虫了。
选择器
scrapy封装了css选择器、xpath和正则。当然你要使用外部bs4和lxml只需导入对应包就行。
这个没什么需要说的,会用xpath和pyquery基本就会这个了
items
(https://doc.scrapy.org/en/latest/topics/items.html)
作用是从非结构化源中提取结构化数据。通俗的来说就是从网页提取你想要的信息,然后把这些信息打包成一个类似于字典的类。注意:提取是爬虫做的事,这个文件里面的类仅仅起着一个字典的作用。至于为什么需要这样一个类就不清楚了。写法很简单,看例子。
import scrapy
class MyItem(scrapy.Item):
name = scrapy.Field()
price = scrapy.Field()
stock = scrapy.Field()
管道
简单来说,就是将item的数据存储到数据库或文件中。另外,他还有一些其他的功能,比如清理HTML数据,去重数据等。
每个管道类都可以有四个方法,其中process_item必须有
- process_item:用于写一些存储的代码
- open_spider:打开蜘蛛时会调用此方法,用于打开资源
- close_spider:蜘蛛关闭时调用此方法,用于关闭资源
- from_crawler:同Spider的方法,一般用于获取setting.py的配置,这是为了便于修改参数,当然你完全可以不写这个方法,将一些参数直接定义为类属性。
存储到MongoDB的示例代码(这是官网照搬的):
import pymongo
class MongoPipeline(object):
collection_name = 'scrapy_items'
def __init__(self, mongo_uri, mongo_db):
self.mongo_uri = mongo_uri
self.mongo_db = mongo_db
@classmethod
def from_crawler(cls, crawler):
return cls(
mongo_uri=crawler.settings.get('MONGO_URI'),
mongo_db=crawler.settings.get('MONGO_DATABASE', 'items')
)
def open_spider(self, spider):
self.client = pymongo.MongoClient(self.mongo_uri)
self.db = self.client[self.mongo_db]
def close_spider(self, spider):
self.client.close()
def process_item(self, item, spider):
self.db[self.collection_name].insert_one(dict(item))
return item
Feed exports
当我们没有写数据库管道的时候,我们又想持久化数据。这样我们就可以通过 Feed exports的方式导出数据。支持json、json行、csv、xml、pickle、marshal。
使用也很简单,在抓取的时候加上-o参数。scrapy crawl quotes -o a.json
请求和响应
scrapy.Request(url [,callback,method =‘GET’,headers,body,cookies,meta,encoding =‘utf-8’,priority = 0,dont_filter = False,errback,flags ] )
参数:
- url:请求的URL
- callback:解析响应的函数
- method:请求的类型:‘GET’、’POST’、’PUT’等
- meta:用于传递参数给解析函数
- body:请求体
- headers:请求头,一般用不到
- cookie:不解释
- encoding:编码
- priority:请求的优先级
- dont_filter:是否过滤相同的URL
- errback:出现异常时调用的处理方法
属性和方法:
- url:请求的url
- method:请求的类型
- headers:请求头
- body:参数传入的body
- meta:参数传入的meta
- copy():返回一个新请求,该请求是此请求的副本
- replace():不知道干什么的
response(url [,status = 200,headers = None,body = b’’,flags = None,request = None ] )
一般是下载器返回给解析函数的响应体,所以参数不重要,直接看属性。
- url:…
- status:响应码
- headers:响应头
- body:响应体
- request:此属性,仅仅在蜘蛛中间件可用。一般用于将失败和异常的请求重发。
- meta:requets.meta传递过来的值
- flags:暂时没用过
- copy():返回一个副本
- replace():不知道有什么用
- urljoin():作用同urlparse.urljoin(response.url, url)
- follow (): 参数同scrapy.Request。用于在解析函数中发出新的请求,可以替代scrapy.Request。而且,支持相对链接和a类型的选择器。
设置
scrapy允许在多个层面上修改设置。他们分别是(包含优先级):
- 命令行选项(最优先)
- 每蜘蛛的设置
- 项目设置模块
- 每个命令的默认设置
- 默认全局设置(优先级较低)
我们一般会修改2和3。2是通过爬虫的custom_settings属性来配置,3则是通过settings.py来配置。
总结
使用scrapy的一般步骤
- 创建项目:scrapy startproject baidu
- 测试xpath规则:scrapy shell “https://www.baidu.com”
- 创建爬虫文件并编写部分代码
- 编写items.py需要抓取的字段
- 补全爬虫文件代码
- 编写pipelines.py的mongo管道
- 修改配置文件的一些参数
- 编写随机头和代理中间件
可以根据这个步骤一步一步的看,然后查怎么去实现。