一、安装环境
scrapy 安装
1.安装Twisted www.lfd.uci.edu/~gohlke/pyt…
Twisted‑18.9.0‑cp36‑cp36m‑win32.whl cp36 是python版本win32是python的位数
2.命令安装
pip install Twisted‑18.9.0‑cp36‑cp36m‑win32.whl
3.pip install scrapy
pip list 查看已经安装的第三方库
二、基本介绍
之前学习的请求库:urllib urllib3 requeste 解析库:re lxml Bs4(BeautifulSoup4),scripy是纯python开发的一个高效结构化的网页抓取框架
三、命令
1.全局命令
scrapy startproject 创建项目
2.项目命令
scrapy genspider [options] <name> <domain>创建爬虫文件scrapy genspider baidu_spider baidu.com
scrapy crawl 运行爬虫
scrapy list 查看当前项目可运行的爬虫
四、注意事项
此框架默认遵守robots协议,可以在settings中修改ROBOTSTXT_OBEY为false
五、运行流程
scrapy 运行流程,engine(引擎) spider(爬虫文件) engine(引擎) scheduler(调度器) downloader(下载器) engine(引擎) spider(爬虫文件) tiem(管道)
六、实际案例
第一步 创建项目 scrapy startproject TanzhouSpider
第二步 创建spider文件 scrapy genspider tz_spider shiguangkey.com
第三步 编写items文件,知道自己需要抓取的数据
第四步 解析数据,提取Request或者items
第五步 保存数据
用的到基础知识点:yield 生成器,回调函数,isinstance 判断实例类型,zip 方法两个列表,返回一个大的列表,元素是一一对应的元组
spider文件中的内容:
# -*- coding: utf-8 -*-import scrapy
from ..items import MyspiderItem
class TzSpiderSpider(scrapy.Spider):
name = 'tz_spider'
# allowed_domains = ['shiguangkey.com']
start_urls = ['http://ke.qq.com/course/list?mt=100{}'.format(i) for i in range(1,7)]
def parse(self, response):
# 解析数据
# print(response.url+'========')
titles = response.xpath('//h4[@class="item-tt"]/a/text()')
# print('title',title)#匹配出来的是对象
titles = titles.extract()
# print(title)#匹配出来的是列表
school_names = response.xpath('//span[@class="item-source"]/a/text()')
# print('school_name',school_name)
school_names = school_names.extract()
items = MyspiderItem()
for title, school_name in zip(titles, school_names):
items['title'] = title
items['school_name'] = school_name
yield items
#返回item对象
# 跟进链接 翻页
next_url = response.xpath('//a[@class="page-next-btn icon-font i-v-right"]/@href').extract()
print(next_url)
if next_url:
yield scrapy.Request(url=next_url[0],callback=self.parse)
#数据写入在pipelines.py中
如上代码,我们是发起请求,然后使用xpath来定位数据,最后保存到items,我们也可以使用yield来分页爬取数据。
items.py中的内容:
# -*- coding: utf-8 -*-import scrapy
class MyspiderItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
# pass
title = scrapy.Field()
school_name = scrapy.Field()
如上代码,我们爬取的数据,保存items时,需要在这个文件中定义字段,才可以保存数据。
pipelines.py中的内容:
# -*- coding: utf-8 -*-import json
class MyspiderPipeline(object):
def process_item(self, item, spider):
'''
这个方法是必须实现的
:param item:
:param spider:
:return:
'''
with open('item.json','a+',encoding='utf-8') as f:
# f.write(json.dumps(item)+'\n')#老写发
f.write(str(item)+'\n')#新写法
return item
#激活才可以写入到文件,激活在settings中的67行
如上代码,我们爬取的数据保存到items中,我们保存到文件中,当然,后续我们可以让其保存到数据库等一些地方。