使用 scrapy 抓取知乎api数据并存储到 sqlite3 和 csv文件中
1. 项目准备 —— 继续使用 上一篇文章 中的项目做修改
2. 项目结构,新增了test目录以及questiondata.py文件,后续用来查看数据是否已经写入数据库
项目结构
3. 修改配置文件setting.py
(1)调高日志级别,去除无用的干扰日志
log_level= 'warning'
设置日志级别
(2)去除中间件注释,计算爬虫耗时
spider_middlewares = {
'zhihuspider.middlewares.zhihuspiderspidermiddleware': 543,
}
去除中间件注释
(3)去除 item_pipelines 注释,并添加一条规则
item_pipelines = {
'zhihuspider.pipelines.zhihuspiderwritetocsvpipeline': 300, # zhihuspiderwritetocsvpipeline 与 pipelines 中 class 名称相同
'zhihuspider.pipelines.zhihuspiderwritetodbpipeline': 400 # zhihuspiderwritetodbpipeline 与 pipelines 中 class 名称相同
去除 item_pipelines 注释
4. 修改 middlewares.py 文件,计算爬虫时间
(1) 导入 time 模块
import time
(2)在 from_crawler 方法中添加以下内容,监听爬虫开始与结束
crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
crawler.signals.connect(s.spider_closed, signal=signals.spider_closed)
(3)增加并修改 spider_opened 和 spider_closed 方法
def spider_opened(self, spider):
self.starttime = time.time()
print(' 爬虫开始 '.center(50, *))
print((' 开始时间:%.2f ' % self.starttime).center(50, *))
def spider_closed(self, spider):
self.endtime = time.time()
_t = self.endtime - self.starttime
print((' 结束时间:%.2f ' % self.endtime).center(50, *))
print((' 耗时:%.2f s ' % _t).center(50, *))
print(' 爬虫结束 '.center(50, *))
middlewares.py 文件
5. 修改 pipelines.py 处理数据
(1)增加 zhihuspiderwritetocsvpipeline 类 ,数据写入到csv文件(异常暂不处理)
class zhihuspiderwritetocsvpipeline(object):
def open_spider(self, spider):
self.csvfile = open(os.path.abspath('../test.csv'), w+,newline='')
try:
self.write = csv.writer(self.csvfile)
self.write.writerow(('id', '问题'))
except exception as e:
pass
def close_spider(self, spider):
self.csvfile.close()
def process_item(self, item, spider):
self.write.writerow((item[qid], item[qtitle]))
except baseexception as e:
return item
(2)增加 zhihuspiderwritetodbpipeline 类,数据写入到 sqlite3
class zhihuspiderwritetodbpipeline(object):
self.conn = sqlite3.connect(os.path.abspath('../test.db'))
self.cursor = self.conn.cursor()
self.cursor.execute('create table question (qid varchar(20) primary key, qtitle varchar(20))')
connmit()
self.cursor.close()
self.connmit()
self.conn.close()
self.cursor.execute('insert into question (qid, qtitle) values (?, ?)', (item[qid], item[qtitle]))
pipelines.py
6. 修改 items.py 文件
items.py
7. 修改主爬虫文件 questionspider.py
questionspider.py
8. 修改数据测试文件 questiondata.py
import sqlite3,os
conn = sqlite3.connect(os.path.abspath('../test.db'))
cursor = conn.cursor()
cursor.execute('select * from question')
values = cursor.fetchall()
cursor.close()
conn.close()
print(values)
questiondata.py
9. 最后运行爬虫就可以了
csv 文件
数据库中的部分数据
ps: 知乎接口查找, 打开 https://zhihu/explore,向下滚动会发现如下请求
查看地址以及请求参数
也可以在底部查看请求参数
喜欢就点个赞吧!
另付源码地址:https://gitee/vuji/python3-webcrawler/tree/master/demo4/zhihuspider