Day05 爬虫学习第五天: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…写了好久,最近因为其他的事情有点心情复杂,导致学习进度缓慢,要好好调整状态。然后发现自己的行测能力有点弱,可以花一些时间看些相关的题。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值