一.什么是scrapy?
是为了爬取网站数据,提取结构性数据而编写的应用框架。之所以叫做框架是因为集成了各种实用功能(高性能异步下载,队列,分布式,解析,持久化等等)的项目模板。对于框架的学习,重点是要学习其框架的特性、各个功能的用法。
二.安装方法
Linux:
pip3 install scrapy
Windows:
a. pip3 install wheel
b. 下载twisted http:
/
/
www.lfd.uci.edu
/
~gohlke
/
pythonlibs
/
#twisted
c. 进入下载目录:执行pip3 install Twisted‑
17.1
.
0
‑cp35‑cp35m‑win_amd64.whl
d. pip3 install pywin32
e.
pip3 install scrapy
三.基础使用
1.创建项目:scrapy startproject 项目名称
1 project_name/ 2 scrapy.cfg: 3 project_name/ 4 __init__.py 5 items.py 6 pipelines.py 7 settings.py 8 spiders/ 9 __init__.py 10 11 scrapy.cfg 项目的主配置信息。(真正爬虫相关的配置信息在settings.py文件中) 12 items.py 设置数据存储模板,用于结构化数据,如:Django的Model 13 pipelines 数据持久化处理 14 settings.py 配置文件,如:递归的层数、并发数,延迟下载等 15 spiders 爬虫目录,如:创建文件,编写爬虫解析规则
2.创建爬虫应用程序
cd 项目名称
scrapy genspider 应用名称 爬取网页的起始url
scrapy gender meinv www.xxx.com (起始url随便写,项目里边可以修改)
3.编写爬虫文件:在执行完步骤2后,会在项目的spider中生成一个应用名的py文件,如下
1 import scrapy 2 3 class QiubaiSpider(scrapy.Spider): 4 name = 'qiubai' #应用名称 5 #允许爬取的域名(如果遇到非该域名的url则爬取不到数据)一般注释掉 6 allowed_domains = ['https://www.qiushibaike.com/'] 7 #起始爬取的url 8 start_urls = ['https://www.qiushibaike.com/'] 9 10 #访问起始URL并获取结果后的回调函数,该函数的response参数就是向起始的url发送请求后,获取的响应对象.该函数返回值必须为可迭代对象或者NUll 11 def parse(self, response): 12 print(response.text) #获取字符串类型的响应内容 13 print(response.body)#获取字节类型的相应内容
4.设置修改settings配置文件相关配置
1 修改内容及其结果如下: 2 19行:USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36' #伪装请求载体身份 3 4 22行:ROBOTSTXT_OBEY = False #可以忽略或者不遵守robots协议
5.执行爬虫程序
scrapy crawl 应用名称(spider里边的爬虫文件的中的name字段不能有重复的)
四.示例
爬取糗事百科首页中段子的内容和标题
1 import scrapy 2 3 class QiubaiSpider(scrapy.Spider): 4 name = 'qiubai' 5 # allowed_domains = ['https://www.qiushibaike.com/'] 用不到 6 start_urls = ['https://www.qiushibaike.com/'] 7 8 def parse(self,response): 9 #xpath为response中的方法,可以将xpath表达式直接作用于该函数中 10 odiv = response.xpath('//div[@id="content-left"]/div') 11 content_list = [] #用于存储解析到的数据 12 for div in odiv: 13 #xpath函数返回的为列表,列表中存放的数据为Selector类型的数据.我们解析到的内容被封装到Selector对象中,需要调用extract()函数将解析到的内容从Selector中取出. 14 author = div.xpath('.//div[@class="author clearfix"]/a/h2/text()')[0].extract() 15 content=div.xpath('.//div[@class="content"]/span/text()')[0].extract() 16 17 #将解析到的内容封装到字典中 18 dic = { 19 '作者':author, 20 '内容':content 21 } 22 #将数据存储到content_list这个列表中 23 content_list.append(dic) 24 return content_list
执行程序
scrapy crawl 爬虫名称 : 该种执行形式会显示执行的日志信息 scrapy crawl 爬虫名称 --nolog:该种执行形式不会显示执行的日志信息 settings中写入: LOG_LEVEL = 'ERROR' #会只打印出错误日志信息