Scrapy异步爬虫框架
scrapy介绍
- Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍。
- 该框架就是一个集成了各种功能(高性能异步下载,队列,分布式,解析,持久化等)的具有强通用性的项目模板。
- Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。
- 对于Scrapy框架学习,重点是要学习Scrapy框架的特性,各个功能的用法.
scrapy安装
pip install scrapy
scrapy基本使用
1.创建一个工程 scrapy startproject proName
2.进入工程目录,在目录下创建爬虫文件:scrapy genspider spiderName www.xxx.com
3.编写爬虫文件
4.执行工程 scrapy crawl spiderName
下面按照上面的4个步骤创建一个爬虫project,对段子网站 的段子进行爬取
1.创建一个工程
首先创建工程
scrapy startproject firstBlood
,
2.创建爬虫文件
进入 firstBlood文件夹,创建爬虫文件
scrapy genspider first www.xxx.com
上述两个操作完成后,会得到如下图所示的文件列表。
其中setting.py是配置文件,pipelines是管道模块,用来执行保存数据的操作,爬虫文件first.py在spiders文件夹内
3.编写爬虫文件
在爬虫文件中,定义好了一个类,该类的父类是Spider,Spider是scrapy所有类的父类。
类中定义了三个属性和一个方法。
- name:爬虫文件的名称
- start_url:起始url列表
- 作用:可以对列表中的url进行get请求的发送
- allow_demains:允许的域名
- parse(self,response):
- 将起始url列表中的url请求成功后,response就是获取的请求响应,在该方法中负责数据解析
- 在first.py中中编写爬虫文件,编写爬虫文件时使用xpath进行数据解析
- 注意:提取标签内容时,返回的不是字符串,而是Selector对象,字符串是存储在该对象中,需要调用extract()或者extract_first()将Selector对象中的字符串取出。
3.1 修改配置文件
在settings.py中修改默认配置
- scrapy工程默认是遵从robots协议的,需要在配置文件中修改:
- ROBOTSTXT_OBEY = False #不遵从robots协议
- 指定日志等级
- LOG_LEVEL='ERROR'
3.2 数据解析+持久化存储
3.2.1 基于终端指令进行存储
- 首先在first.py爬虫文件中进行数据解析
- 然后进行持久化存储到磁盘,只可以将parse方法的返回值存储写入到指定后缀的文本文件中,可写入的文件类型(‘json’, ‘jsonlines’, ‘jl’, ‘csv’, ‘xml’, ‘marshal’, ‘pickle’)
- 通过下面的终端指令将返回值存储到csv文件中:
scrapy crawl first-o data_duanzi.csv
3.2.2 基于管道进行存储
- 实现流程
- 1.在爬虫文件中解析数据
- 2.在Item类中定义相关的属性(解析的数据有几个字段就定义几个属性)
- 3.将在爬虫文件中解析的数据存储封装到Item对象中
- 4.将存储了解析数据的Item对象提交给管道
- 5.在管道文件中接受Item对象,且对其进行任意形式的持久化存储操作
- 6.在配置文件中开启管道
- 首先在first.py爬虫文件中进行数据解析
- 下面在items类中定义相关的属性,用来存储解析到的字段
a. 存储到txt文件
- 在管道文件中接受Item对象,存储到txt文件
b.存储到数据库
-
在管道文件中接受Item对象,存储到MySQL数据库
-
在配置文件settings.py中开启管道
ITEM_PIPELINES = {
'firstBlood.pipelines.FirstbloodPipeline': 300 #数字代表优先级
}
4.执行工程
- 基于终端指令存储
在终端中执行scrapy crawl first-o data_duanzi.csv
,保存的csv文件如下图:
- 基于管道存储到txt
在终端执行工程scrapy crawl frist
,保存的txt文件如下图
- 基于管道存储到MySQL数据库
在终端执行工程scrapy crawl frist
,保存的MySQL文件如下图所示
附:连接到数据库的两种方式
如果要将数据保存到数据库中,需要先连接到自己的数据库,顺便说一下python连接到MySQL的2种方式,当然连接方式不止两种,这里写两种我用到的:
- 1.利用sqlalchemy来连接,需要安装相应的库
import pandas as pd
from sqlalchemy import create_engine
# 初始化数据库连接
# 按实际情况依次填写MySQL的用户名、密码、IP地址、端口、数据库名
engine = create_engine('mysql+pymysql://root:****@localhost:3306/test')
# 如果觉得上方代码不够优雅也可以按下面的格式填写
# engine = create_engine("mysql+pymysql://{}:{}@{}:{}/{}".format('root', '12345678', 'localhost', '3306', 'testdb'))
# MySQL导入DataFrame
# 填写自己所需的SQL语句,可以是复杂的查询语句
sql_query = 'select * from account;'
# 使用pandas的read_sql_query函数执行SQL语句,并存入DataFrame
df_read = pd.read_sql_query(sql_query, engine)
print(df_read)
df_read
返回结果如下,读取到我的test数据库中account表的内容
- 2.利用pymysql连接,需要安装相应的库
import pymysql
from pymysql.cursors import DictCursor
# 创建数据库连接 localhost等效于127.0.0.1
conn = pymysql.connect(host="127.0.0.1",port=3306,user="root",passwd="1234",db="test",charset="utf8")
# 建立游标,指定游标类型,返回字典
cur = conn.cursor(DictCursor)
# 操作语句,只查询前两行
sql = 'select * from emp limit 2;'
# 执行sql语句
cur.execute(sql)
# 获取查询的所有结果
res = cur.fetchall()
# 打印结果
print(res)
# 关闭游标
cur.close()
# 关闭连接
conn.close()
返回结果如下,读取到我test数据库中emp表的内容,limit 2 给出前两个:
在上面的持久化存储的代码中用的就是第二种使用pymsql连接到数据库的方式。
emmm…写了好久,最近因为其他的事情有点心情复杂,导致学习进度缓慢,要好好调整状态。然后发现自己的行测能力有点弱,可以花一些时间看些相关的题。