一、Scrapy概述
1、什么是?
异步爬虫框架
2、Scrapy它有什么优势?
可配置和可扩展性非常高;
Scrapy框架是基于Twisted异步网络框架:复杂 、闭包
(更多参考http://scrapy-chs.readthedocs.io/zh_CN/1.0/intro/overview.html)
二、Scrapy的工作流程
红框中就是我们通常需要编写的。
三、Scrapy快速入门
目标url:https://www.douban.com/
需求:爬取的内容 、标题。如下图:
第一步 、创建scrapy项目
在dos命令行 或者pycharm终端输入:
scrapy startproject mySpider(scrapy项目的名称)
结果:
items.py文件:将数据封装,比如标题;
middlewares.py文件:我们折叠之后可以看到,里面是2个类:
pipelines.py文件:管道,数据的保存等是在这里编写。
settings.py文件:配置项,
在上图中相应处取消注释。
(补充,为了使结果中没有各种警告字段,我们可以在settings.py文件中任一空白行写入:LOG_LEVEL = ‘WARNING’,如下图
)
第二步 创建爬虫程序
根据上一步结果中的提示:
继续在cmd中输入cd mySpider,之后,又因为我们要爬取的网站是www.douban.com,我们继续输入
scrapy genspider douban “douban.com” (douban是爬虫的名字 ;douban.com是爬取的范围)
结果:
我们打开douban.py(爬虫文件)可以看到:
我们在解析函数中做个简单的编写,如下图:
第三步 运行scrapy的命令(有2种方法)
方法1、 在终端 scrapy crawl douban #(爬虫名字)
方法2、 可以运行py文件
我们先在mySpider文件夹中(选中该文件夹右键)创建一个py文件,再右键run运行:
或者:
cmdline.execute(‘scrapy crawl db’.split())
第四步 获取数据(基于页面分析)
我们从第三步的结果(下图)可知:
response是一个HtmlResponse的类对象,是对象,就会有方法,我们可以具体看看它里面封装了些什么方法:
按住ctrl,左键点击进去。
结果:
发现它什么也没有,就是继承了父类TextResponse,我们继续ctrl左键点击进去看TextResponse类的具体封装。
我们发现,它有一个xpath方法,那么response也可以继承使用。
所以:
import scrapy
#from scrapy.http.response.html import HtmlResponse
class DbSpider(scrapy.Spider):
name = 'db'
allowed_domains = ['douban.com']
start_urls = ['http://douban.com/']
# 解析方法
def parse(self, response):
li_lst = response.xpath('//div[@class="side-links nav-anon"]/ul/li')
item = {}
for li in li_lst:
item['name'] = li.xpath('a/text()')
print(item)
结果:
发现获得的是selector对象。
如果要获得selector对象当中的文本数据,有以下方法:
get():返回一条数据
getall() :返回多条数据
所以:
结果:
发现有空,所以:
import scrapy
#from scrapy.http.response.html import HtmlResponse
class DbSpider(scrapy.Spider):
name = 'db'
allowed_domains = ['douban.com']
start_urls = ['http://douban.com/']
# 解析方法
def parse(self, response):
li_lst = response.xpath('//div[@class="side-links nav-anon"]/ul/li')
item = {}
for li in li_lst:
item['name'] = li.xpath('a/em/text()').get()
if item['name'] == None:
item['name'] = li.xpath('a/text()').get()
print(item)
结果:
四、items.py文件的使用
(1)我们打开items.py文件,写入:title = scrapy.Field()
(2)在爬虫文件中引用items.py的MyspiderItem类:
第1步:选中mySpider文件夹右键-Mark-Directory as-Sources Root,把mySpider文件夹设置成根目录(之后,该文件夹会成蓝色)
第2步:from导入类
第3步:实例化对象
(3)具体数据的赋值
必须是items.py文件中注册的变量名:修改后得到正确结果