一、安装scrapy
首先安装依赖库Twisted
pip install (依赖库的路径)
在这个网址http://www.lfd.uci.edu/~gohlke/pythonlibs#twisted 下面去寻找符合你的python版本和系统版本的Twisted
然后在安装scrapy框架
pip install scrapy
【注意】路径名不能有中文,不能用管理员进入cmd,电脑系统用户路径不能是中文
二、框架简介
该框架是一个第三方的框架,许多功能已经被封装好(比如:下载功能)
由五部分构成:
引擎、下载器、爬虫、调度器、管道(item和pipeline)
以上五部分我们只需要关系其中的两部分:爬虫和管道
spiders:蜘蛛或爬虫,我们分析网页的地方,我们主要的代码写在这里
管道:包括item和pipeline,用于处理数据
引擎:用来处理整个系统的数据流,触发各种事务(框架的核心)
下载器:用于下载网页内容,并且返回给蜘蛛(下载器基于Twisted的高效异步模型)
调度器:用来接收引擎发过来的请求,压入队列中等处理任务
三、使用
- 创建项目指令
scrapy startproject 项目名
- 项目目录结构
firstSpider 项目名称
firstSpider
spiders 爬虫目录(写代码位置)
__init__.py
myspider.py 爬虫文件,以后的爬虫代码写在这里
__init__.py
items.py 定义数据结构地方
middlewares.py 中间件(了解)
pipelines.py 管道文件
settings.py 项目配置文件
scrapy.cfg
- 创建爬虫指令
scrapy genspider 爬虫名 域名
- 运行爬虫指令
scrapy crawl 爬虫名
scrapy crawl 爬虫名 -o xxx.csv\json\xml
四、执行流程
1输入scrapy crawl '项目名称'
2读取setting.py配置信息
3执行spiders目录下的爬虫程序,执行_init_()方法和parse()方法
4在parse方法里解析html,返回一个item实4按照配置顺序执行pipelines.py(可多个)执行逻辑,一般是存储。
5程序结束。
五、管道包含 items and pipline
- 作用
1、清理HTML数据。
2、验证爬取数据,检查爬取字段。
3、查重并丢弃重复内容。
4、将爬取结果保存到数据库。
- 几个核心的方法
创建一个项目的时候都会自带pipeline其中就实现了process_item(item, spider)方法
1、open_spider(spider)就是打开spider时候调用的,常用于初始化操作(常见开启数据库连接,打开文件)
2、close_spider(spider)关闭spider时候调用,常用于关闭数据库连接
3、from_crawler(cls, crawler)是一个类方法(需要使用@classmethod装饰器标识),一般用来从settings.py中获取常量的
4、process_item(item, spider)是必须实现的,别的都是选用的!
- 参数
item是要处理的item对象
spider当前要处理的spider对象
- 返回值
返回item就会继续给优先级低的item pipeline二次处理
如果直接抛出DropItem的异常就直接丢弃该item
- piplines.py
进行数据存储
# -*- coding: utf-8 -*-
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
import csv
import pymysql
# 写入csv表格
class InterestingPipeline(object):
# 开启爬虫
def open_spider(self,spider):
self.csv_file = open("u148.csv",'w',encoding='utf-8')
# 创建一个列表用于整合csv数据
self.csv_items = []
def process_item(self, item, spider):
# 整合csv数据
# 把item字典转化成列表
csv_item =[]
csv_item.append(item['title'])
csv_item.append(item['author'])
csv_item.append(item['intro'])
csv_item.append(item['img'])
csv_item.append(item['type'])
csv_item.append(item['date'])
self.csv_items.append(csv_item)
# 【注意】这里每遍历一个item以后一定要把他返回出去,如果不返回,其它优先级比这个管道低的就无法获取到其它item
return item
def close_spider(self,spider):
# 把前面整合完成的数据写入csv文件
writer = csv.writer(self.csv_file)
# 写表头
writer.writerow(['title','author','intro','img','type','date'])
# 写内容
writer.writerows(self.csv_items)
self.csv_file.close()
# 定义一个管道类,用于写入数据库
class MysqlPipeline(object):
def open_spider(self,spider):
self.db =pymysql.connect(host='127.0.0.1',port=3306,user='root',password='123456',db='u148',charset='utf8')
self.cursor =self.db.cursor()
# self.db.begin()
def process_item(self,item,spider):
# 定义sql语句
sql = "INSERT INTO music VALUES(NULL,'%s','%s','%s','%s','%s','%s')"%(item['title'],item['author'],item['img'],item['intro'],item['type'],item['date'])
self.cursor.execute(sql)
self.db.commit()
return item
def close_spider(self,spider):
self.cursor.close()
self.db.close()
- items.py
import scrapy
# 主要是对待爬取的数据进行模型化,并且对接需求分析
class InterestingItem(scrapy.Item):
# 本质是一个字典对象,
# define the fields for your item here like:
# name = scrapy.Field()
# 网页里面需要爬取那些内容
# title
title = scrapy.Field()
# 图片
img = scrapy.Field()
# 简介
intro = scrapy.Field()
# 作者
author = scrapy.Field()
# 类型
type = scrapy.Field()
# 日期
date = scrapy.Field()
五、settings配置
- 代理设置
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
- 是否遵循robots协议
ROBOTSTXT_OBEY = False
- 下载延时
# 单位:秒
DOWNLOAD_DELAY = 2
- 默认请求头
DEFAULT_REQUEST_HEADERS = {
'Accept': '*/*',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Content-Type': 'application/x-www-form-urlencoded',
'Connection': 'keep-alive',
# 'Host': 'passport.weibo.cn',
'Origin': 'https://passport.weibo.cn',
'Referer': 'https://passport.weibo.cn/signin/login?entry=mweibo&r=https%3A%2F%2Fweibo.cn%2F%3Fluicode%3D20000174&backTitle=%CE%A2%B2%A9&vt='
}
- 开启管道
ITEM_PIPELINES = {
#300表示优先级,范围(0-1000),越小级别越高
'Weibo.pipelines.WeiboPipeline': 300,
}