scrapy环境安装和基本使用
环境安装:
Linux:
pip install scrapy
Windows:
a. pip install wheel
b. 下载twisted http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
c. 进入下载目录,执行 pip install Twisted‑17.1.0‑cp35‑cp35m‑win_amd64.whl
- twisted:帮助scrapy实现异步的一个工具。
- 该步骤如果出错,可以尝试下载安装其他版本的twisted文件
d. pip install pywin32
e. pip install scrapy
- scrapy的基本使用
- 创建一个工程:scrapy startproject ProName
- spiders:爬虫文件夹。需要在内部创建一个爬虫文件
- settings:配置文件
- cd ProName
- 创建爬虫文件:scrapy genspider spiderName www.xx.com
- 执行工程:scrapy crawl spiderName
数据解析:
持久化存储
--基于终端指令的持久化存储:
--只可以将parse方法的返回值写入到本地文件,不可以存储到数据库
--指令:scrapy crawl spiderName -o filePath
--基于管道的持久化存储:
--在爬虫文件中进行数据解析
--将解析的数据存储封装到Item对象中
--将Item类型的对象提交给管道
--在管道文件中接受item对象,且对其内部存储的数据进行任何形式的持久化存储
--在配置文件中开启管道机制
当多个管道类,分别存入本地和mysql还有redis的同时,管道里代码如下! redis版本太高可能报错,建议降低版本
import pymysql
from redis import Redis
class QiubaiproPipeline:
fp = None
def open_spider(self,spider):
print('执行开始...')
self.fp = open('./qiubai.txt','w',encoding='utf-8')
def process_item(self, item, spider):
author = item['author']
content1 = item['content1']
self.fp.write(author+':'+content1)
return item#将这个item交给下一个即将执行的管道类
def close_spider(self,spider):
print('执行结束...')
class MysqlPipeline:
conn = None #创建连接对象
cursor = None
def open_spider(self,spider):
self.conn = pymysql.Connect(host='127.0.0.1',port=3306,user='root',password='root',db='spider',charset='utf8')
print(self.conn)
def process_item(self, item, spider):
author = item['author']
content1 = item['content1']
self.cursor = self.conn.cursor()
# sql = 'insert into qiushibaike values("{}","{}")'.format(author, content1)
sql = 'insert into qiushibaike values("%s","%s")'%(author, content1)
try:
self.cursor.execute(sql)
self.conn.commit()
except Exception as e:
print(e)
self.conn.rollback()
return item # 将这个item交给下一个即将执行的管道类
def close_spider(self,spider):
self.cursor.close()
self.conn.close()
class RedisPipeline:
conn = None
def open_spider(self,spider):
self.conn = Redis(host='127.0.0.1',port=6379)
def process_item(self, item, spider):
self.conn.lpush('qiushibaiData',item) #前者是先起的名字 然后把item往里放
下面是部分总结:
- 持久化存储
- 爬虫文件中进行数据解析
- 将解析的数据存储到item类型的对象
- 将item对象提交给管道
- 在管道中接收item,对其进行任意形式的持久化存储
- 在配置文件中开启管道
- 问题:什么时候需要用到多个管道类?
- 实现数据备份的时候。
- 如何将一组数据持久化存储到不同的载体中呢?
- 一个管道类表示将一组数据存储到一种形式的载体中。
- 如果有两个管道类的,爬虫文件提交的item会不会同时提交给这多个管道类?
- 爬虫文件提交的item只会提交给优先级最高的那一个管道类。
- 如何将item提交给其他的管道类?
无法实现。我们却可以将优先级最高的管道类接收到的item对象传递给其他的管道类。
在process_item方法中return item操作表示将item传递给下一个即将被执行的管道类
- 手动请求发送
- yield关键字在框架中只会被作用到两个地方
- 向管道提交item
- 手动发起请求
- yield scrapy.Reqeust(url,callback):发起的是get请求
- start_urls列表如何帮我们自动进行get请求发送
- 自动调用了一个start_reqeusts的方法,方法的模拟实现如下:
def start_requests(self):#模拟实现该方法的原始实现
print('i am start_requests()')
for url in self.start_urls:
yield scrapy.Request(url,callback=self.parse)
- 如何手动发起post请求:
- yield scrapy.FormRequest(url,formdata,callback)
- 如何让start_urls的列表元素发起post请求
- 重写start_reqeusts方法。
def start_requests(self):#模拟实现该方法的原始实现
print('i am start_requests()')
for url in self.start_urls:
yield scrapy.FormRequest(url,formdata,callback=self.parse)
- 请求传参
- 作用:可以帮助scrapy实现数据的深度爬取
- 深度爬取:爬取的数据没有存在于同一张页面
- 效果:可以让爬虫文件中多个解析的方法公用同一个item对象
- 传递item:yield scrapy.Request(url,callback,meta)
- 接受item:response.meta
- 五大核心组件
- 中间件的基本操作

浙公网安备 33010602011771号