目录
1.选取目标站点
目标站点分析
http://quotes.toscrape.com/:scrapy官方提供的抓取网站
显示名人名言,作者,标签等信息
翻页为最简单的GET请求,通过改变URL的名称进行翻页
网页结构简单,没有任何的反爬虫措施
2.流程框架
抓取第一页
请求第一页的URL并得到源代码,进行下一步的分析
获取内容和下一页链接
分析源代码,提取首页内容,获取下一页链接等待进一步获取
翻页提取
请求下一页信息,分析内容并请求再下一页链接
保存爬取结果
将爬取结果保存为特定格式如文本,数据库
3.爬虫实战
在命令行中输入scrapy会输出提示
创建项目
scrapy startproject quotetutorial
会在当前目录生成项目文件
cd quotetutorial 进入项目文件夹
scrapy.cfg:配置文件,定义scrapy一些相关的部署信息
创建spider
scrapy genspider quotes quotes.toscrape.com
quotes:spider名称
quotes.toscrape.com:需要爬取网站的域名
scrapy.cfg
items.py:保存数据的数据结构
middlewares.py:在爬取过程中定义的中间件,用来处理request,response和exceptions等操作,可以在其中修改request,response和exceptions的相关配置
pipelines.py:项目管道,用来输出一些items
settings.py:定义配置信息
主要运行代码在spiders文件夹中
解析的操作在parse函数中
scrapy crawl quotes:执行spider
输出调试信息
info:提示信息
scrapy.utils.log:显示已启动
2019-06-01 19:34:39 [scrapy.utils.log] INFO: Scrapy 1.6.0 started (bot: firstscrapy)
scrapy.crawler:settings
Overridden settings: {'BOT_NAME': 'firstscrapy', 'NEWSPIDER_MODULE': 'firstscrapy.spiders', 'ROBOTSTXT_OBEY': True, 'SPIDER_MODULES': ['firstscrapy.spiders']}
scrapy.middleware:中间件(下载中间件:downloadermiddlewares;爬虫中间件:spidermiddlewares)
INFO: Spider opened:调用spider,开始抓取
2019-06-01 19:34:41 [scrapy.core.engine] DEBUG: Crawled (404) <GET http://quotes.toscrape.com/robots.txt> (referer: None)
2019-06-01 19:34:41 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://quotes.toscrape.com/> (referer: None)
首先寻找robots.txt,没有返回状态码404,随后访问主页正常为200
statscollectors:输出爬取信息
quotes.py
改写代码:parse:请求完成后默认调用的方法/默认回调
eg:
def parse(self, response):
print(response.text)
请求成功后将response的内容打印出来
4.抓取:
1.分析源代码
内容:text
作者:author
标签:tags(tags数量不固定,有几个抓几个)
2.爬取中的存储(数据结构)
items.py
定义field变量赋值,作为一个整体生成
3.定义解析的方法
quotes.py
11:定义选择每个区块
之后遍历每个区块,进一步筛选
13:声明对象
::text:选择标签内的文本内容
extract_first():拿到里面的文本内容
extract():把所有结果都找出来,类似于find和findall
3.命令行交互模式
scrapy shell quotes.toscrape.com
进入到交互模式下,可以进行一些相关的调试
爬取到的quotes为list格式,每一项为selector选择器
同为list
同为list,data类型为str
返回列表,内容为文本
返回第一个值
若为tags,就需要用extract()获取所有的标签
4.赋值
item['text'] = text
item['author'] = author
item['tags'] = tags
yield item#将item生成出来
再次运行,即可完成单页索引信息的爬取
5.翻页
1.可通过改变URL来完成翻页
2.在next中对应着下一页的超链接,从网页代码中获取
提取:
next = response.css('.pager .next a::attr(href)').extract_first()
attr():获取属性的内容
补全为完整的URL:
url = response.urljoin(next)
urljoin():补全URL
生成request,实现翻页循环:
url = response.urljoin(next)
callback:回调函数,定义response请求之后谁来处理
6.保存
保存为json格式
scrapy crawl quotes -o quotes.json
生成json文件并保存在项目目录下
保存为jl格式
scrapy crawl quotes -o quotes.jl
将结果保存为一行一行的格式,一行为一个item
保存为csv格式
scrapy crawl quotes -o quotes.csv
保存为xml格式
scrapy crawl quotes -o quotes.xml
其他格式同改后缀即可,如pickle,marshal等
保存至FTP服务器
scrapy crawl quotes -o ftp://user:pass@ftp.example.com/path/quotes.csv
pipelines
在保存前需要做item的处理,如在解析完后有些item不是我们想要的,如要将item保存到数据库里需要借助pipelines工具。
eg:限制名言的长度,如果大于50将后面的变为省略号
pipelines.py
class TextPipeline(object):
def __init__(self):
self.limit = 50
def process_item(self, item, spider):
if item['text']:
if len(item['text']) > self.limit:
item['text'] = item['text'][0:self.limit].rstrip() + '. . .'
else:
return DropItem('Missing Text')
保存至MongoDB数据库
pipelines中:
class MongoPipeline(object):
def __init__(self):
self.mongo_uri = 'localhost'
self.mongo_db = 'quotestutorial'
def open_spider(self, spider):
self.client = pymongo.MongoClient(self.mongo_uri)
self.db = self.client[self.mongo_db]
def process_item(self, item, spider):
name = item.__class__.__name__
self.db[name].insert(dict(item))
return item
def close_spider(self, spider):
self.client.close()
settings.py中:
ITEM_PIPELINES = {
'firstscrapy.pipelines.TextPipeline': 300,
'firstscrapy.pipelines.MongoPipeline': 400,
}
保存结果