记录一下网络爬虫实战scrapy---某蜜蜂网站

前言:最近在一个横向课题,其中需要做一个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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值