- Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍。
- 该框架就是一个集成了各种功能(高性能异步下载,队列,分布式,解析,持久化等)的具有强通用性的项目模板。
- Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。
- 对于Scrapy框架学习,重点是要学习Scrapy框架的特性,各个功能的用法.
pip install scrapy
1.创建一个工程 scrapy startproject proName
2.进入工程目录,在目录下创建爬虫文件:scrapy genspider spiderName www.xxx.com
3.编写爬虫文件
4.执行工程 scrapy crawl spiderName
下面按照上面的4个步骤创建一个爬虫project,对段子网站 的段子进行爬取
首先创建工程
scrapy startproject firstBlood
,
进入 firstBlood文件夹,创建爬虫文件
scrapy genspider first www.xxx.com
上述两个操作完成后,会得到如下图所示的文件列表。
其中setting.py是配置文件,pipelines是管道模块,用来执行保存数据的操作,爬虫文件first.py在spiders文件夹内
在爬虫文件中,定义好了一个类,该类的父类是Spider,Spider是scrapy所有类的父类。
类中定义了三个属性和一个方法。
- name:爬虫文件的名称
- start_url:起始url列表
- 作用:可以对列表中的url进行get请求的发送
- allow_demains:允许的域名
- parse(self,response):
- 将起始url列表中的url请求成功后,response就是获取的请求响应,在该方法中负责数据解析
在settings.py中修改默认配置
- scrapy工程默认是遵从robots协议的,需要在配置文件中修改:
- ROBOTSTXT_OBEY = False #不遵从robots协议
- 指定日志等级
- LOG_LEVEL='ERROR'
scrapy crawl first-o data_duanzi.csv
- 实现流程
- 1.在爬虫文件中解析数据
- 2.在Item类中定义相关的属性(解析的数据有几个字段就定义几个属性)
- 3.将在爬虫文件中解析的数据存储封装到Item对象中
- 4.将存储了解析数据的Item对象提交给管道
- 5.在管道文件中接受Item对象,且对其进行任意形式的持久化存储操作
- 6.在配置文件中开启管道
ITEM_PIPELINES = {
'firstBlood.pipelines.FirstbloodPipeline': 300 #数字代表优先级
}
scrapy crawl first-o data_duanzi.csv
,保存的csv文件如下图:scrapy crawl frist
,保存的txt文件如下图scrapy crawl frist
,保存的MySQL文件如下图所示如果要将数据保存到数据库中,需要先连接到自己的数据库,顺便说一下python连接到MySQL的2种方式,当然连接方式不止两种,这里写两种我用到的:
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表的内容
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…写了好久,最近因为其他的事情有点心情复杂,导致学习进度缓慢,要好好调整状态。然后发现自己的行测能力有点弱,可以花一些时间看些相关的题。