项目主代码:
1 import scrapy 2 from qiushibaike.items import QiushibaikeItem 3 4 class QiubaiSpider(scrapy.Spider): 5 name = 'qiubai' 6 # allowed_domains = ['www.baidu.com'] 7 8 #爬取数据的url 9 start_urls = ['https://www.qiushibaike.com/text/'] 10 11 #基于终端命令,必须让parse方法返回一个可迭代类型的对象 12 def parse(self, response): 13 div_list=response.xpath('//div[@id="content-left"]/div') 14 data_list=[] 15 for div in div_list: 16 #extract()可以将Selector对象存储的数据值获取 17 author=div.xpath('./div/a[2]/h2/text()').extract_first() 18 content=div.xpath('./a/div/span//text()').extract() 19 content="".join(content) 20 dic={ 21 'author':author, 22 'content':content 23 } 24 data_list.append(dic) 25 return data_list 26 # 基于终端命令,必须让parse方法返回一个可迭代类型的对象 27 28 #基于管道的持久化存储 29 def parse(self, response): 30 div_list = response.xpath('//div[@id="content-left"]/div') 31 for div in div_list: 32 # extract()可以将Selector对象存储的数据值获取 33 author = div.xpath('./div/a[2]/h2/text()').extract_first() 34 content = div.xpath('./a/div/span//text()').extract() 35 content = "".join(content) 36 37 #设计到持久化存储的相关操作必须写在管道文件中 38 #实例化一个item对象,将解析到的数据存储到该对象中去 39 item=QiushibaikeItem() 40 item['author']=author 41 item['content']=content 42 43 #将item对象交给管道 44 yield item
items类中代码:
1 author=scrapy.Field() 2 content=scrapy.Field()
pipelines类中代码
1 #将数据存储到txt文件中 2 class QiushibaikePipeline(object): 3 4 fp=None 5 #重写父类的方法 6 def open_spider(self,spider): 7 self.fp=open('./qiutu.txt','w',encoding='utf-8') 8 print('开始爬虫') 9 10 #该方法只能处理item类型的对象,爬虫文件每向管道提交一次item,则该方法就会调用一次 11 def process_item(self, item, spider): 12 #取出存在item中的数据 13 author=item['author'] 14 content=item['content'] 15 self.fp.write(author+':'+content) 16 return item 17 def close_spider(self,spider): 18 self.fp.close() 19 print('爬虫结束') 20 21 #将数据存储到txt文件中 22 class CsvPipeLine(object): 23 24 fp=None 25 #重写父类的方法 26 def open_spider(self,spider): 27 self.fp=open('./qiutu.csv','w',encoding='utf-8') 28 print('开始爬虫1') 29 30 #该方法只能处理item类型的对象,爬虫文件每向管道提交一次item,则该方法就会调用一次 31 def process_item(self, item, spider): 32 #取出存在item中的数据 33 author=item['author'] 34 content=item['content'] 35 self.fp.write(author+':'+content) 36 return item 37 def close_spider(self,spider): 38 self.fp.close() 39 print('爬虫结束1')
setting配置代码
1 #伪装请求头 2 USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36' 3 4 # 不遵守协议 5 ROBOTSTXT_OBEY = False 6 7 8 #开放管道代码 9 ITEM_PIPELINES = { 10 'qiushibaike.pipelines.QiushibaikePipeline': 300, 11 'qiushibaike.pipelines.CsvPipeLine': 301, 12 13 }