csv模块
- 作用:将爬取的数据存放到本地的csv文件中
- 使用流程
- 打开csv文件
- 初始化写入对象
- 写入数据(参数为列表)
- writerow([]):单行写入
- writerows((),(),()]:多行写入,一次性写入多行数据
pymysql模块与mysql数据库交互流程
- 创建数据库连接对象—》db = pymysql.connect(xx,xx,xx,xx)
- 创建游标对象 —》cursor = db.cursor()
- 执行sql命令 —》 cursor.execute(sql语句,[xx,xx])
- 提交到数据库执行 ----》db.commit()
- 关闭游标 —》cursor.close()
- 断开数据库连接 ----》db.close()
pymysql之excutemany()方法
- 作用
- 减少数据库io次数,提高效率,一次性插入多条数据
- csv与mysql保存比较
增量爬虫mysql
- 定义:每次爬取只抓新更新的链接,之前抓取过的链接不会再继续抓取
- 实现
- mysql中新建指纹表,用来存储所有爬取过的链接的指纹
- 在爬取任何链接之前,先判断该指纹是否存在于指纹表。如果已经存在则不再进行爬取
- 准备1-给url地址进行md5加密生成指纹
from hashlib import md5
s = md5()
s.update(url.encode())
finger = s.hexdigest() - 准备2-pymysql模块如何获取执行查询语句后的结果
import pymysql
cursor.execute(‘select * from cartab’)fetchall()得到的结果为元组
result = cursor.fetchall()
增量redis
- 原理
- redis基于内存,效率极高
- 利用redis中集合的特性,自动去重,可以轻松管理所有请求的指纹
- 实现思路
- 利用集合的sadd()方法向集合中添加指纹,根据返回值来判断集合中是否存在该指纹
- 添加成功返回1,表示此请求之前并未抓取过
- 添加失败返回0,表示此请求之前已经抓取过