六、糗事百科之爬取多个页面----scrapy爬虫初学者学习过程-----精通Python爬虫框架scrapy

六、糗事百科之爬取多个页面

Link.
作者:Irain
QQ联系方式:2573396010
微信:18802080892

1 主要文件内容:

1.2 糗事百科spider.py示例代码
# -*- coding: utf-8 -*-
import scrapy
from choushibaike.items import ChoushibaikeItem
class SpiderChoushibaikeSpider(scrapy.Spider):
    name = 'spider_csbk'   #  爬虫名称
    allowed_domains = ['qiushibaike.com']  #  限定爬取该域名下的内容
    start_urls = ['https://www.qiushibaike.com/text/page/1/']  # 访问请求开始
    base_domain = "https://www.qiushibaike.com"   #   补充下一页的域名
    def parse(self, response):
        print("$" * 20)
        duanzidivs = response.xpath("//div[@class='col1 old-style-col1']/div")   #   SelectorList
        for duanzidiv in duanzidivs:            #  Selector
            author = duanzidiv.xpath(".//h2/text()").get().strip()  #  爬取段子的作者
            content = duanzidiv.xpath(".//div[@class='content']//text()").getall()  # 爬取一个段子所有内容
            content = "".join(content).strip()   #  转换为json形式,去掉字符串两边的空格
            item = ChoushibaikeItem(author= author, content= content)   #  固定传参数量、以类的形式传参(不是字典)
            yield  item
        next_url = response.xpath("//*[@id='content']/div/div[2]/ul/li[last()]/a/@href").get()  #  获取下一页url
        if not next_url: #   判断是否有下一页
            return  #  没有下一页返回为空
        else:
            yield  scrapy.Request(self.base_domain + next_url, callback=self.parse)
            #  有下一页,继续爬取。类似递归思路,直到没有为止。
        print("$" * 20)

1.2 item.py 定义实例变量
import scrapy
class ChoushibaikeItem(scrapy.Item):   #   Item中定义实例变量
    # define the fields for your item here like:
    # name = scrapy.Field()
    author = scrapy.Field()
    content = scrapy.Field()
1.3 pipelines.py
from scrapy.exporters import JsonLinesItemExporter
#   JsonLinesItemExporter:一个字典一行,不满足json格式的;数据都直接存到磁盘文件中,内存占用少.
class ChoushibaikePipeline(object):
    def __init__(self):
        self.fp = open("duanzi.json","wb")   # 管道类初始化,以wb二进制打开文件,二进制没有编码形式
        # ensure_ascii=False:以中文字符保存
        self.exporter = JsonLinesItemExporter(self.fp, ensure_ascii=False, encoding='utf-8') 	
    def open_spider(selfs,spider):    # 爬虫开始前,执行
        print('开始了')
    def process_item(self, item, spider):    # 爬虫开始过程,执行
        self.exporter.export_item(item)      # 爬虫获取到的每项item数据的处理方法
        return item
    def close_spider(self,spider):    # 爬虫结束后,执行
        self.fp.close()   #   关闭文件
        print("over")
1.4 settings.py设置
DOWNLOAD_DELAY = 1   #  下载前等待1秒

在这里插入图片描述

2 结果展示

在这里插入图片描述

3 报错:[scrapy.spidermiddlewares.offsite] DEBUG: Filtered offsite request to ‘www.qiushibaike.com’: <GET https://www.qiushibaike.com/text/page/2/>

在这里插入图片描述
在这里插入图片描述

解决方法:
allowed_domains = ['qiushibaike.com']  #  限定爬取该域名下的内容

在这里插入图片描述

日期:2020年4月16日

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值