爬取糗事百科上段子的作者名字和段子内容 https://www.qiushibaike.com/text/
首先,创建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
将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 即可完成持久化存储。
编码流程:
数据解析在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关键字是个什么鬼?它有什么用处?