14. python爬虫——基于scrapy框架爬取糗事百科上的段子内容

tech2022-10-04  88

python爬虫——基于scrapy框架爬取糗事百科上的段子内容

1、需求2、分析及实现3、实现效果4、进行持久化存储(1)基于终端指令(2)基于管道

【前置知识】python爬虫——scrapy框架使用教程

1、需求

爬取糗事百科上段子的作者名字和段子内容 https://www.qiushibaike.com/text/

2、分析及实现

首先,创建scrapy工程文件,在命令行上输入: scrapy startproject qiubaiPro

然后,进入qiubaiPro文件,在命令行上输入: cd qiubaiPro

之后再创建爬虫文件,在命令行上输入: scrapy genspider qiubai www.xxx.com

将settings.py中的部分内容改为:

USER_AGENT = 'Mozilla/......' # Obey robots.txt rules ROBOTSTXT_OBEY = False LOG_LEVEL='ERROR'

将spiders文件夹下的qiubai.py进行修改

import scrapy class QiubaiSpider(scrapy.Spider): name = 'qiubai' # allowed_domains = ['www.xxx.com'] start_urls = ['https://www.qiushibaike.com/text/'] def parse(self, response): #解析:作者的名称+段子的内容 div_list = response.xpath('//*[@id="content"]/div/div[2]/div') print(div_list) for div in div_list: author = div.xpath('./div/a[2]/h2/text()').extract_first() content = div.xpath('./a[1]/div//text()').extract() content = ''.join(content) print(author,content)

知识点:python中join()函数的使用方法

进行爬取: scrapy crawl qiubai

3、实现效果


4、进行持久化存储

(1)基于终端指令

将qiubai.py中的内容改为

import scrapy class QiubaiSpider(scrapy.Spider): name = 'qiubai' # allowed_domains = ['www.xxx.com'] start_urls = ['https://www.qiushibaike.com/text/'] def parse(self, response): #解析:作者的名称+段子的内容 div_list = response.xpath('//*[@id="content"]/div/div[2]/div') #存储所有解析到的数据 all_data = [] for div in div_list: #xpath返回的是列表,但是列表元素一定是Selector类型的对象 #extract可以将Selector对象中data参数存储的字符串提取出来 author = div.xpath('./div/a[2]/h2/text()').extract_first() #列表调用了extract之后,则表示将列表中每一个Selector对象中data对应的字符串提取了出来 content = div.xpath('./a[1]/div//text()').extract() content = ''.join(content) dic = { 'author':author, 'content':content } all_data.append(dic) print(dic) return all_data

执行命令时输入scrapy crawl qiubai -o ./qiubai.csv 即可完成持久化存储。

(2)基于管道

编码流程:

数据解析在item类中定义相关的属性将解析的数据封装存储到item类型的对象将item类型的对象提交给管道进行持久化存储的操作在管道类的process_item中要将其接收到的item对象中存储的数据进行持久化存储操作在配置文件中开启管道

好处: 通用性强

(1)在item中定义相关属性 items.py文件

import scrapy class QiubaiproItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() author = scrapy.Field() content = scrapy.Field()

(2)解析数据,将解析到的数据存储到item类型的对象中,然后将其提交给管道

qiubai.py文件

import scrapy from qiubaiPro.items import QiubaiproItem class QiubaiSpider(scrapy.Spider): name = 'qiubai' # allowed_domains = ['www.xxx.com'] start_urls = ['https://www.qiushibaike.com/text/'] def parse(self, response): #解析:作者的名称+段子的内容 div_list = response.xpath('//*[@id="content"]/div/div[2]/div') #存储所有解析到的数据 all_data = [] for div in div_list: #xpath返回的是列表,但是列表元素一定是Selector类型的对象 #extract可以将Selector对象中data参数存储的字符串提取出来 author = div.xpath('./div/a[2]/h2/text()').extract_first() #列表调用了extract之后,则表示将列表中每一个Selector对象中data对应的字符串提取了出来 content = div.xpath('./a[1]/div//text()').extract() content = ''.join(content) item = QiubaiproItem() item['author'] = author item['content'] = content #将item提交给管道 yield item

(3)在配置文件中开启管道,将接收到的item对象进行持久化存储

settings.py文件

ITEM_PIPELINES = { 'qiubaiPro.pipelines.QiubaiproPipeline': 300, #300表示的是优先级,数值越小优先级越高 }

pipelines.py文件

from itemadapter import ItemAdapter class QiubaiproPipeline: fp = None #重写父类的一个方法:该方法只在开始爬虫的时候被调用一次 def open_spider(self,spider): print('开始爬虫......') self.fp = open('./qiubai.txt','w',encoding='utf-8') #专门用来处理item类型的对象 #该方法可以接收爬虫文件提交过来的item对象 #该方法每接收到一个item就会被调用一次 def process_item(self, item, spider): author = item['author'] content = item['content'] self.fp.write(author+':'+content+'\n') return item def close_spider(self,spider): print('结束爬虫!') self.fp.close()

命令行上输入scrapy crawl qiubai 即可完成爬取并持久化存储工作

知识点: python中的yield关键字是个什么鬼?它有什么用处?

最新回复(0)