前言:最近在一个横向课题,其中需要做一个QA,由于没有数据,所以我们需要通过爬虫去获取
设计好schema,我们来看需要的数据
需要从上面这个页面获取到201条的url,再进入这些url中获取标题以及内容等文本数据
这里主要分享一个遇到一个小问题。
如下图,我们需要将文本内容与二级小标题进行对应。一开始我没发现文本内容有换行,导致二级标题与文本内容有错位情况。
解决思路:我们可以发现即使有换行,但是其首字符是数字。而且是有顺序的我们可以做一个小处理
下面为具体代码,因为我只需要保存为txt文本即可,所以item对于我而言并没有用。
# -*- coding: utf-8 -*-
import scrapy
from ..items import BeekgItem
class BeeSpider(scrapy.Spider):
name = 'bee'
allowed_domains = ['kumifeng.com']
url = 'http://www.kumifeng.com/baike/index_{}.html'
needUrl = 'http://www.kumifeng.com'
offset = 2 #起始页
start_urls = [url.format(str(offset))] # 拼接为完整url
def parse(self, response):
links = response.xpath('//*[@class="listtile"]/a/@href').extract()
del links[0:2]
for link in links: # 遍历上个列表
url = self.needUrl + link
yield scrapy.Request(url, callback=self.parse_s,dont_filter=True) # 请求下一层url,方法为第二个parse,dont_filter=True的作用是避免有时候新的url会被作用域过滤掉
# 第二部分
m_page = 21 # 这里设置的是第一层的url有多少页
if self.offset < m_page: # 如果当前页小于最大页
self.offset += 1 # 偏移量自增1
yield scrapy.Request(self.url.format(str(self.offset)), callback=self.parse,dont_filter=True) # 再此请求第一层的新的url
def parse_s(self,response):
f=open("name.txt","a",encoding='utf-8')
item = BeekgItem()
# 文章标题
title = response.xpath('//*[@class="btitle"]/h1/text()').extract()
title = ''.join(title)
item["title"] = title
#f.write(title+'\n')
# 文章描述
des = response.xpath('//*[@class="des"]/text()').extract()
des = ''.join(des)
f.write(title+',描述,'+des+'\n')
# 文章内容
content = response.xpath('//*[@class="article bgf margintop10px"]/p/text()').extract()
sencondTitle= response.xpath('//*[@class="article bgf margintop10px"]/p/strong/text()').extract()
allContent = ''
newContent1 = []
sense = ''
start = 1
for i in range(len(content)):
num = content[i][0]
if num.isdigit() == False:
newContent1.append(content[i])
continue
else:
if str(start) == num:
start += 1
sense += content[i]
else:
newContent1.append(sense)
sense = ''
start = 2
sense += content[i]
newContent1.append(sense)
for i in range(len(sencondTitle)):
result = sencondTitle[i].split("、")[1]
oneContent = result +',' +newContent1[i]
allContent = title+','+oneContent+'\n'
f.write(allContent)
# 标题回答
answer = response.xpath('//*[@class="article bgf margintop10px"]/p/span/text()').extract()
answer = ''.join(answer)
f.close()
yield item