免责声明
本文的爬虫知识仅用于合法和合理的数据收集,使用者需遵守相关法律法规及目标网站的爬取规则,尊重数据隐私,合理设置访问频率,不得用于非法目的或侵犯他人权益。因使用网络爬虫产生的任何法律纠纷或损失,由使用者自行承担风险和责任。
1、Scrapy保存数据到数据库
概述:下面通过一个完整的案例让大家了解Scrapy如何将数据保存到不同的数据库。
1.1、获取数据
1.1.1.创建项目和爬虫文件
1.1.2.编写爬虫文件
import scrapy
import json
class SsqSpider(scrapy.Spider):
name = "ssq"
allowed_domains = ["gov.cn"]
start_urls = ["https://www.cwl.gov.cn/cwl_admin/front/cwlkj/search/kjxx/findDrawNotice?name=ssq&pageNo=1&pageSize=30&systemType=PC"]
def parse(self, response):
datas = json.loads(response.text)
# 获取所有的数据列表
for data in datas.get("result"):
# 期号 红球 蓝球
print(data.get("code"),'===',data.get("red"),'===',data.get("blue"))
1.1.3、修改配置文件
# 添加请求头
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
'scrapy.downloadermiddlewares.retry.RetryMiddleware': None,
'scrapy_fake_useragent.middleware.RandomUserAgentMiddleware': 400,
'scrapy_fake_useragent.middleware.RetryUserAgentMiddleware': 401,
}
# 配置 UserAgent 类型
FAKEUSERAGENT_PROVIDERS = [
'scrapy_fake_useragent.providers.FakeUserAgentProvider', # 第一选择
'scrapy_fake_useragent.providers.FakerProvider', # 第二选择
'scrapy_fake_useragent.providers.FixedUserAgentProvider', # 第三选择
]
# 关闭爬虫规则
# ROBOTSTXT_OBEY = True
1.1.3、创建并编辑启动脚本
在scrapy09项目下创建启动脚本begin:
from scrapy.cmdline import execute
execute(["scrapy","crawl","ssq"])
运行启动脚本,结果如下:
1.2、将数据保存到mongo
概述:将前面获取到的数据返回给引擎,引擎再交给pipeline,pipeline再将获取的数据保存到指定数据库中。
1.2.1、修改爬虫文件
import scrapy
import json
class SsqSpider(scrapy.Spider):
name = "ssq"
allowed_domains = ["gov.cn"]
start_urls = ["https://www.cwl.gov.cn/cwl_admin/front/cwlkj/search/kjxx/findDrawNotice?name=ssq&pageNo=1&pageSize=30&systemType=PC"]
def parse(self, response):
datas = json.loads(response.text)
# 获取所有的数据列表
for data in datas.get("result"):
# 将获取的数据传递给引擎
yield {
"code":data.get("code"), # 期号
"red":data.get("red"), # 红球
"blue":data.get("blue") # 蓝球
}
1.2.2、修改Pipeline文件
import pymongo
class MongoPipeline:
def open_spider(self):
# 获取客户端链接
self.client = pymongo.MongoClient()
# 通过客户端获取数据库实例,再通过数据库实例获取指定的集合
self.ssq = self.client.myssq_data.ssq
def process_item(self, item, spider):
# 将引擎传过来的数据写入mongo数据库
self.ssq.insert_one(item)
return item
def close_spider(self):
self.client.close()
1.2.3、编辑配置文件
# 主要是开启ITEM_PIPELINES,注意将pipeline修改成自己的pipeline名称
ITEM_PIPELINES = {
"scrapy09.pipelines.MongoPipeline": 300,
}
1.2.4、运行爬虫文件
注意:运行前一定要提前开启mongo,否则Pycharm将无法连接到mongo。
运行启动脚本后,通过图形管理工具Robo 3T查看mongo数据库中的数据如下,由此可知已将获取的数据正确的保存到了mongo数据库中:
1.3、将数据保存到MySql
注意:以下操作都是在1.2的基础上进行,如果跳过了上面的内容无法实现的可以查看是否少了上面的某些操作。
1.3.1、操作前准备
首先下载pymysql(在终端中运行如下代码):
pip install pymysql
然后去自己的mysql数据库创建一个名为ssq的数据库,并进入ssq数据库创建一个名为ssq_table的表,以下是ssq_table的表结构(以上名字都是可以改的,只是修改后代码也许做出对应的调整):
1.3.2、编写Pipeline文件
概述:在1.1小节中就以及将数据获取了,本节只需编写Pipeline文件将数据存储到mysql即可。
import pymysql
class MysqlPipeline:
# 创建链接
def open_spider(self,spider):
# 获取客户端连接(要提前在mysql中创建一个名为ssq的数据库)
self.client = pymysql.connect(host="localhost",port=3306,user="root",password="123456",db="ssq",charset="utf8")
# 获取游标对象
self.cursor = self.client.cursor()
def process_item(self, item, spider):
# 向表中插入数据的sql语句(ssq_table这个表也要提前创建)
sql = "insert into ssq_table (id,code,red,blue) values (0,%s,%s,%s)"
# 对应sql中要传入的参数
args = (item['code'],item['red'],item['blue'])
# 执行sql语