本文共 5121 字,大约阅读时间需要 17 分钟。
当爬取的数据已经被存放在 Items 以后,如果 Spider(爬虫) 解析完 Response(响应结果),Items 就会传递到 Item Pipeline(项目管道) 中,然后在 Item Pipeline 中创建用于处理数据的类,这个类就是项目管道组件,通过执行一连串的处理即可实现数据的清洗、存储等工作。
Item Pipeline(项目管道)的典型用途如下:
在编写自定义 Item Pipeline 时,可以实现以下几个方法:
了解 Item Pipeline(项目管道)的作用后,接下来便可以将爬取的数据信息通过 Item Pipeline 存储到数据库中,这里以爬取京东图书排行榜信息为例,将爬取的数据信息存储至 MySQL 数据库当中。实现的具体步骤如下:
(1) 安装并调试 MySQL 数据库,然后通过 Navicat for MySQL 创建数据库名称 jd_data
,如下图所示:
jd_data
数据库当中创建名称为 ranking
的数据表,如下图所示: https://book.jd.com/booktop/0-0-0.html?category=3287-0-0-0-10001-1
验证成功之后,按 <F12>
快捷键或者鼠标右键打开浏览器的开发者工具,首先选择 Network 选项,然后找到该页面的 URL,单击,切换到 Response 选项卡,验证我们要抓取的数据是否在响应当中,如果不是我们需要重新找请求页面数据的 URL。
import scrapyclass JdItem(scrapy.Item): book_name = scrapy.Field() # 保存图书名称 author = scrapy.Field() # 保存作者 press = scrapy.Field() # 保存出版社
(6) 打开 JdSpider.py 爬虫文件,在该文件中重写 start_requests 方法,用于实现对京东图书排行榜的网络请求。以及在该方法的下面,重写 parse() 方法,用于实现网页数据的抓取,然后将爬取的数据添加至 Item 对象中。代码如下:
import scrapyfrom jd.items import JdItemclass JdspiderSpider(scrapy.Spider): name = 'JdSpider' allowed_domains = ['book.jd.com'] start_urls = ['http://book.jd.com/'] def start_requests(self): # 需要访问的地址 url = "https://book.jd.com/booktop/0-0-0.html?category=3287-0-0-0-10001-1" yield scrapy.Request(url=url, callback=self.parse) # 发送网络请求 def parse(self, response): li_list = response.xpath('//div[@class="m m-list"]/div/ul/li') for li in li_list: # 获取图书名称 book_name = li.xpath('div[@class="p-detail"]/a/text()').extract_first() # 获取作者 author = li.xpath('//div[@class="p-detail"]/dl[1]/dd/a[1]/text()').extract_first() # 获取出版社 press = li.xpath('//div[@class="p-detail"]/dl[2]/dd/a[1]/text()').extract_first() item = JdItem() # 创建Item对象 # 将数据添加至Item对象 item['book_name'] = book_name item['author'] = author item['press'] = press yield item
(8) 使用 Pycharm 运行当前爬虫,如下:
import pymysql # 导入数据库连接PyMySQL模块class JdPipeline: # 初始化数据库参数 def __init__(self, host, database, user, password, port): self.host = host self.database = database self.user = user self.password = password self.port = port @classmethod def from_crawler(cls, crawler): # 返回cls()实例对象,其中包含通过crawler获取的配置文件中的数据库参数 return cls( host=crawler.settings.get('SQL_HOST'), database=crawler.settings.get('SQL_DATABASE'), user=crawler.settings.get('SQL_USER'), password=crawler.settings.get('SQL_PASSWORD'), port=crawler.settings.get('SQL_PORT'), ) # 打开爬虫时调用 def open_spider(self, spider): # 数据库连接 self.db = pymysql.connect(self.host, self.user, self.password, self.database, self.port, charset="utf8") self.cursor = self.db.cursor() # 创建游标 # 关闭爬虫时调用 def close_spider(self, spider): self.db.close() def process_item(self, item, spider): data = dict(item) # 将Item转换成字典类型 # SQL语句 sql = "insert into ranking(book_name,press,author) values (%s,%s,%s)" # 执行数据的插入 self.cursor.execute(sql, (data['book_name'], data['press'], data['author'])) self.db.commit() # 提交 return item # 返回Item
(10) 打开 settings.py 文件,在该文件中找到激活项目管道的代码并解除注释状态,然后设置数据库信息的变量。代码如下:
ROBOTSTXT_OBEY = FalseUSER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'SQL_HOST = 'localhost' # 数据库地址SQL_USER = 'root' # 用户名SQL_PASSWORD = 'mysql' # 密码SQL_DATABASE = 'jd_data' # 数据库名称SQL_PORT = 3306 # 端口# 开启jd项目管道ITEM_PIPELINES = { 'jd.pipelines.JdPipeline': 300,}
(11) 打开 main.py 文件,在该文件中再次启动爬虫,爬虫程序执行完毕以后,打开 ranking 数据表,将显示如下图所示的数据信息。
好书不厌读百回,熟读课思子自知。而我想要成为全场最靓的仔,就必须坚持通过学习来获取更多知识,用知识改变命运,用博客见证成长,用行动证明我在努力。
如果我的博客对你有帮助、如果你喜欢我的博客内容,请点赞
、评论
、收藏
一键三连哦!听说点赞的人运气不会太差,每一天都会元气满满呦!如果实在要白嫖的话,那祝你开心每一天,欢迎常来我博客看看。 编码不易,大家的支持就是我坚持下去的动力。点赞后不要忘了关注
我哦!
转载地址:http://ldjk.baihongyu.com/