网络爬虫之Scrapy实战二:爬取多个网页

前面介绍的scrapy爬虫只能爬取单个网页。如果我们想爬取多个网页。比如网上的小说该如何如何操作呢。比如下面的这样的结构。是小说的第一篇。可以点击返回目录还是下一页


对应的网页代码:



我们再看进入后面章节的网页,可以看到增加了上一页



对应的网页代码



通过对比上面的网页代码可以看到. 上一页,目录,下一页的网页代码都在<div>下的<a>元素的href里面。不同的是第一章只有2个<a>元素,从二章开始就有3个<a>元素。因此我们可以通过<div>下<a>元素的个数来判决是否含有上一页和下一页的页面。代码如下



最终得到生成的网页链接。并调用Request重新申请这个网页的数据


那么在pipelines.py的文件中。我们同样需要修改下存储的代码。如下。可以看到在这里就不是用json.而是直接打开txt文件进行存储

class Test1Pipeline(object):
    def __init__(self):
        self.file=''
    def process_item(self, item, spider):
        self.file=open(r'E:\scrapy_project\xiaoshuo.txt','wb')
        self.file.write(item['content'])
        self.file.close()
        return item

 

完整的代码如下:在这里需要注意两次yield的用法。第一次yield后会自动转到Test1Pipeline中进行数据存储,存储完以后再进行下一次网页的获取。然后通过Request获取下一次网页的内容

# -*- coding:UTF-8 -*- #
from scrapy.spiders import Spider
from scrapy.selector import Selector
from scrapy.http import Request

from test1.items import Test1Item
from scrapy.utils.response import open_in_browser

class testSpider(Spider):
    name="test1"
    allowd_domains=['http://www.xunsee.com']
    start_urls=["http://www.xunread.com/article/8c39f5a0-ca54-44d7-86cc-148eee4d6615/1.shtml"]
    def parse(self, response):
        init_urls="http://www.xunread.com/article/8c39f5a0-ca54-44d7-86cc-148eee4d6615"
        sel=Selector(response)
        context=''
        content=sel.xpath('//div[@id="content_1"]/text()').extract()
        for c in content:
            context=context+c.encode('utf-8')
        items=Test1Item()
        items['content']=context
        count = len(sel.xpath('//div[@id="nav_1"]/a').extract())
        if count > 2:
            next_link=sel.xpath('//div[@id="nav_1"]/a')[2].xpath('@href').extract()
        else:
            next_link=sel.xpath('//div[@id="nav_1"]/a')[1].xpath('@href').extract()
        yield items
        for n in next_link:
            url=init_urls+'/'+n
            print url
            yield Request(url,callback=self.parse)

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿与代码

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值