- 【前置知识】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)
进行爬取:
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
即可完成爬取并持久化存储工作