scrapy框架
框架介绍: 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 项目名称 2. cd proName 3.创建爬虫文件 scrapy genspider spidername xxx.com 4.执行 scrapy crawl spiderName scrapy crawl spider --nolog #忽略log日志
# -*- coding: utf-8 -*- import scrapy class Pa1Spider(scrapy.Spider): # 爬虫文件的名称 name = 'pa1' # allowed_domains = ['www.xxx.com'] # 允许域名 start_urls = ['https://www.qiushibaike.com/text/'] # 起始url列表 可写多个 # 解析数据 def parse(self, response): #响应 div_list = response.xpath('//div[@id="content-left"]/div') names = [] for div in div_list: # author = div.xpath('./div[1]/a[2]/h2/text()')[0].extract() author = div.xpath('./div[1]/a[2]/h2/text()').extract_first() names.append({'name':author}) #必须封装到字典中 ('json', 'jsonlines', 'jl', 'csv', 'xml', 'marshal', 'pickle') return names # 持久化存储 # - 基于终端指令 特性:只能将parse方法的返回值存到磁盘里面
scrapy crawl first -o qiubai.csv #指定文件类型有要求.json .csv
# - 基于管道 pipelines
- 数据解析 spider.py
- 封装item类 items.py
- 实例化item类型的对象 spider.py
- 将解析倒的数据依次存储封装到item类型的对象中
- 将item对象提交给管道
- 在管道中实现IO操作 spider.py
- 开启管道 settings.py
# 同一份数据存储到不同的平台:
管道文件定义多个类,之后settings.py里注册开启,根据优先级数字越小,越早执行,不同类之间传递item,在def process_item():中return item.
# 全站数据的爬取: 不同页面
1 页面全添加到start_urls中,不建议,在url很多的时候不好
2 手动请求
设置url模板,%s %d 字符串格式化
手动请求发送写在哪里? 在parse方法
yield scrapy.Request(url=url,parse.callback)
# 5大核心组件
爬虫: 干活的
管道: 接收item,
调度器:
下载器: 去互联网请求
下载中间件作用:拦截请求和响应
-拦截请求:
1 篡改请求头UA UA池,随机random.choice()
2 设置相关请求对象的代理IP(process_exception中)
引擎: 数据流处理,处理事务
# POST请求的发送:
重写def start_requests(self):
yield scrapy.FormRequest(url,callback,formdata)
scrapy 默认是自己处理cookie的, settings.py里面COOKIES_ENNABLE=False
# 日志等级
settings.py 里面 LOG_LEVEL='ERROR'
# 日志路径
settings.py 里面 LOG_FILE = 'path'
# 请求传参的应用场景:
爬取和解析的数据不在同一张页面上面
在请求方法中使用meta(字典)参数,该字典会传递参数给回调函数
回调函数接收meta:response.meta['key']
# 一般的settings.py 里面这样修改 ROBOTSTXT_OBEY = False USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36' ITEM_PIPELINES = { 'xiaohua.pipelines.XiaohuaPipeline': 300, 'xiaohua.pipelines.MysqlPipeline': 200, } # 可定义多个管道类 300优先级 数值越小优先级越高 LOG_LEVEL = "ERROR" # items.py # -*- coding: utf-8 -*- import scrapy class XiaohuaItem(scrapy.Item): name = scrapy.Field() #为啥? 不能保证解析到的数据类型统一, 可以存储任何type的数据 img_url = scrapy.Field()
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# 手动全站数据抓取 # -*- coding: utf-8 -*- import scrapy from xiaohua.items import XiaohuaItem class Xh1Spider(scrapy.Spider): name = 'xh1' # allowed_domains = ['www.ccc.com'] start_urls = ['http://www.521609.com/daxuemeinv/'] # 生成一个通用的url模板 url = 'http://www.521609.com/daxuemeinv/list8%d.html' pageNum = 1 def parse_detail(self,response): pass def parse(self, response): li_list = response.xpath('//div[@class="index_img list_center"]/ul/li') #返回列表 selector for li in li_list: name = li.xpath('./a[2]/text() | ./a[2]/b/text()').extract_first() img_url ='http://www.521609.com' + li.xpath('./a[1]/img/@src').extract_first() # 实例化一个item 对象 item = XiaohuaItem() item['name'] = name item['img_url'] = img_url # item 提交给管道 yield item # 对其他页码的url手动请求的发送 if self.pageNum <= 3: self.pageNum += 1 new_url = format(self.url%self.pageNum) yield scrapy.Request(url=new_url,callback=self.parse)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# -*- coding: utf-8 -*- import scrapy class PostReqSpider(scrapy.Spider): name = 'post_req' # allowed_domains = ['www.bb.com'] start_urls = ['https://fanyi.baidu.com/sug'] # 默认这样的get # def start_requests(self): # for url in self.start_urls: # yield scrapy.Request(url=url,callback=self.parse) def start_requests(self): for url in self.start_urls: data = { 'kw':'dog' } yield scrapy.FormRequest(url=url, callback=self.parse,formdata=data) def parse(self, response): print(response.text)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
scrapy