目录
基于终端指令
- 要求:只可以将parse方法的返回值存储到本地文本文件中
- 注意:存储类型有限制,见终端截图1
- 指令:scrapy crawl 爬虫名 -o 路径
- 优点:简洁高效便捷
- 缺点:局限性较强,后缀有限
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('//div[@class="col1 old-style-col1"]/div')
all_data = [] # 存储所有解析到的数据
for div in div_list:
# extract()可以将selector对象中的data参数存储的字符串提取出来
author = div.xpath('./div[1]/a[2]/h2/text()')[0].extract()
# 列表调用extract()之后,将列表中的每一个selector对象中data对应字符串提取出来
content = div.xpath('./a[1]/div/span//text()').extract()
# 将列表转成字符串
content = ''.join(content)
# # 仅打印第一个作者和段子,查看返回内容
# print(author, content)
# break
dic = {
'author': author,
'content': content
}
all_data.append(dic)
return all_data
![终端截图](https://img-blog.csdnimg.cn/20200816204825915.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2MTgyODUy,size_16,color_FFFFFF,t_70)
基于管道
编码流程
- 数据解析
import scrapy from qiubaiPro.qiubaiPro.items import QiubaiproItem # 导入item类 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('//div[@class="col1 old-style-col1"]/div') all_data = [] # 存储所有解析到的数据 for div in div_list: # extract()可以将selector对象中的data参数存储的字符串提取出来 author = div.xpath('./div[1]/a[2]/h2/text()')[0].extract() # 列表调用extract()之后,将列表中的每一个selector对象中data对应字符串提取出来 content = div.xpath('./a[1]/div/span//text()').extract() # 将列表转成字符串 content = ''.join(content) # 实例化item类 item = QiubaiproItem() # 将爬取到的封装到item的属性中 item['author'] = author item['content'] = content # 向管道提交item,提交多次。每提交一次管道中的process_item方法执行一次 yield item
- 在item类中定义相关属性
item类 - 将解析的数据封装存储到item类型的对象
- 将item对象提交给管道进行持久化存储
import scrapy from qiubaiPro.qiubaiPro.items import QiubaiproItem # 导入item类 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('//div[@class="col1 old-style-col1"]/div') all_data = [] # 存储所有解析到的数据 for div in div_list: # extract()可以将selector对象中的data参数存储的字符串提取出来 author = div.xpath('./div[1]/a[2]/h2/text()')[0].extract() # 列表调用extract()之后,将列表中的每一个selector对象中data对应字符串提取出来 content = div.xpath('./a[1]/div/span//text()').extract() # 将列表转成字符串 content = ''.join(content) # 实例化item类 item = QiubaiproItem() # 将爬取到的封装到item的属性中 item['author'] = author item['content'] = content # 向管道提交item,提交多次。每提交一次管道中的process_item方法执行一次 yield item
- 在管道类的process_item方法中对item携带的数据进行持久化存储
class QiubaiproPipeline: fp = None # 重写父类的方法,该方法只在开始爬虫的时候被调用一次 def open_spider(self, spider): print('开始爬虫。。。') self.fp = open('./qiubai.txt', 'w', encoding='utf-8') # 专门处理item对象 # 接收爬虫文件提交过来的item对象 def process_item(self, item, spider): # 取出数据 author = item['author'] content = item['content'] # 存储 self.fp.write(author+':\n'+content+'\n') return item def close_spider(self, spider): print('结束爬虫。。。') self.fp.close()
管道类 - 在配置文件中开启管道
配置文件 开启 UA伪装等
执行结果:
![](https://img-blog.csdnimg.cn/20200816220337495.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2MTgyODUy,size_16,color_FFFFFF,t_70)