流程思路
将解析数据存到items对象
使用yield 将items交给管道文件处理
在管道文件pipelines编写代码储存到数据库
在setting配置文件开启管道
案例
items中
按照格式定义字段
import scrapy
class QiubaiproItem(scrapy.Item):
# 语法: 字段 = scrapy.Field()
author = scrapy.Field()
content = scrapy.Field()
1
2
3
4
5
6
setting中
解开注释
ITEM_PIPELINES = {
‘qiubaiPro.pipelines.QiubaiproPipeline’: 300, # 300优先级
}
1
2
3
爬虫文件中
必须导入items 中的类
将数据录入item
用yield item提交给管道
import scrapy
from qiubaiPro.items import QiubaiproItem
class QiubaiSpider(scrapy.Spider):
name = ‘qiubai’
# allowed_domains = [‘qiushibaike.com/text’] # 图片可能不是该域名下
start_urls = [‘https://www.qiushibaike.com/text/’] # https 要注意
def parse(self, response):
# 取段子列表
div_list = response.xpath("//div[@id='content-left']/div")
# 存储解析到的页面数据
data_list = []
for div in div_list:
# xpath解析的内容存储到 selector对象中,获取内容.extract()
# extract_first()获取内容 = .extract()[0]
author = div.xpath("./div/a[2]/h2/text()").extract()[0] # 或extract_first()
content = div.xpath(".//div[@class='content']/span/text()").extract_first()
# 1.数据解析到items对象(先导入)
item = QiubaiproItem()
item['author'] = author
item['content'] = content
# 2.将item对象提交给管道
yield item
管道pipelines中
现在数据库中创建对应格式的表
导入pymysql包
在open_spider中链接数据库
利用pymysql进行数据录入
用try捕获并回滚错误
在close_spider中关闭数据库
import pymysql
class QiubaiproPipeline(object):
conn = None
cursor = None # 游标对象
# 1. 链接数据库
# 2. 执行sql语句
# 3. 提交
# 爬虫开始执行
def open_spider(self, spider):
print('开始爬虫,链接数据库')
self.conn = pymysql.Connect(
host='127.0.0.1',
port=3306,
user='root',
password='123',
db='qiubai',
)
# 对提交的item对象,mysql数据库储存
# 爬虫每次提交item,该方法被执行一次
def process_item(self, item, spider):
# 写sql语句 往qiubai这个表中插数据,没有表的话要先在数据库创建
sql = 'insert into qiubai values("%s","%s")' % (item['author'], item['content'])
# 创建游标对象
self.cursor = self.conn.cursor()
# 提交事务
try:
self.cursor.execute(sql)
self.conn.commit()
except Exception as e:
print(e)
print('异常回滚')
self.conn.rollback()
return item
# 结束爬虫时调用
def close_spider(self, spider):
print('爬虫结束')
self.cursor.close()
self.conn.close()
作者:番茄西瓜汤
来源:优快云
原文:https://blog.youkuaiyun.com/weixin_42329277/article/details/84112829
版权声明:本文为博主原创文章,转载请附上博文链接!