scrapy爬虫框架实现url跟进爬取页面详情_跟进爬虫_fallwind_of_july的博客-程序员秘密

技术标签: python  scrapy  

  本篇博文将介绍如何搭建爬虫项目实现目录页的数据爬取,并对每个目录标题下的url进行跟进,进入该url爬取该页面的详情内容。最后把结果保存为本地json文件或者csv文件。详细的项目搭建操作已经在前面博文中提及了,可以参考:
https://blog.csdn.net/fallwind_of_july/article/details/97246577
  文章非常适合有入门基础的小伙伴们一起学习和研究,我的其他博文也有从零开始学习使用scrapy框架的过程。该项目经过实测验证,代码可以成功运行。文章最后给出github免费的源码下载地址,小伙伴下载下来看着源码分析一下就会很清楚了。
  本篇博文是在上一篇的基础上搭建的,上一篇已经成功爬取公到了链接:
https://blog.csdn.net/fallwind_of_july/article/details/97391822
.

一、爬取目标网站:

http://www.gz.gov.cn/gzgov/snzc/common_list.shtml
.

二、爬取目标信息:

  我们将要爬取公告的标题,时间以及链接,以及每个标题下的详情内容,如下图所示:
公告标题:
在这里插入图片描述
标题详情页:
在这里插入图片描述

三、网页分析:

用谷歌浏览器和xpath Helper插件,F12键来分析源代码
公告标题:
在这里插入图片描述
标题详情页:
在这里插入图片描述
对于目录页面:可以看出我们需要的名字、时间、链接对应的xpath分别是:
//ul[@class='news_list']/li/a
//ul[@class='news_list']/li/span
//ul[@class='news_list']/li/a/@href

对于详情页面:可以看出我们需要的详情内容的xpath是:
//div[@class=‘content_article’]/p

四、爬取文件代码

我们只需要修改四个文件即可,分别是items.py;pipelines.py;settings.py;爬虫文件govmenu.py

1.items.py文件

# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html

import scrapy

class GzgovItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    #pass
    name = scrapy.Field()
    time = scrapy.Field()
    link = scrapy.Field()

class DetailsItem(scrapy.Item):
    detail = scrapy.Field()

以上文件定义我们获取信息的字段;将详情页提取到的数据另外保存到一个文件中,因此另写一个类。
.

2.pipelines.py

# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
from Gzgov.items import GzgovItem,DetailsItem
import json

class GzgovPipeline(object):
    def __init__(self):
        #self.f = open("gzgovment.json","w")
        self.f = open("title.json","w")
        self.file_detail = open("detail.json","w")
        
    def process_item(self, item, spider):
        content = json.dumps(dict(item),ensure_ascii=False)
        
        if isinstance(item,GzgovItem):
            self.f.write(content + ',\n')
        
        if isinstance(item,DetailsItem):
            self.file_detail.write(content + ',\n')
        
        return item
    
    def close_spider(self,spider):
        self.f.close()
        self.file_detail.close()

以上文件定义我们保持数据的格式,写到本地文件中。可以看到我们打开了两个文件来保存数据,并通过if isinstance来判断数据来源于哪里(是哪个类的实例),然后写入对应的文件。
.

3.settings.py

1.文件中下面的True改为False

ROBOTSTXT_OBEY = False

2.取消67行左右的注释,得到

ITEM_PIPELINES = {
    'Gzgov.pipelines.GzgovPipeline': 300,
}

以上文件为配置文件
.

4.我们的爬虫文件govmenu.py

爬虫文件名字自定义,在spiders目录下

# -*- coding: utf-8 -*-
import scrapy
from Gzgov.items import GzgovItem,DetailsItem
#from scrapy.http import Request

class GovmenuSpider(scrapy.Spider):
    name = 'govmenu'
    allowed_domains = ['gz.gov.cn']
    #start_urls = ['http://www.gz.gov.cn/gzgov/snzc/common_list.shtml']
    baseURL = "http://www.gz.gov.cn/gzgov/snzc/common_list_"
    offset = 1
    end = ".shtml"
    start_urls = ["http://www.gz.gov.cn/gzgov/snzc/common_list.shtml"]

    def parse(self, response):
        node_list = response.xpath("//ul[@class='news_list']/li")

        for node in node_list:

            item = GzgovItem()            

            item['name'] = node.xpath("./a/text()").extract()
            item['time'] = node.xpath("./span/text()").extract()

            if node.xpath("./a/@href").extract()[0].startswith("../../gzgov/snzc/") :                      
                item['link'] = str("http://www.gz.gov.cn/gzgov/snzc"+"/"+
                    node.xpath("./a/@href").extract()[0].split('/', 5)[4]+"/"+
                    node.xpath("./a/@href").extract()[0].split('/', 5)[5])
            else:
                item['link'] = ""
           # node.xpath("./a/@href").extract()
            
            yield item
            yield scrapy.Request(url=item['link'],callback=self.details)
            
        if self.offset < 67:
            self.offset +=1
            url = self.baseURL + str(self.offset) + self.end
            yield scrapy.Request(url,callback=self.parse)

    def details(self,response):
        item = DetailsItem()
        ps = response.xpath("//div[@class='content_article']/p")        
        item['detail'] = ps.xpath("./text()").extract()
        yield item

以上文件的解释:
1.我们采用url拼接的方式进行数据的翻页爬取,
比如第二页的url就是:
http://www.gz.gov.cn/gzgov/snzc/common_list_2.shtml
以此类推,每次只需要修改数字部分即可。总共67个条目,因此我们判断<67。

2.scrapy中有个Request专门处理跟进的url
yield scrapy.Request(url=item['link'],callback=self.details)
.callback是我们的回调函数,说明接下来将要执行的提取内容和方法,指向了我们新写的关于详情页面的函数def details(self,response):

五、运行结果

json格式

1.目录页在这里插入图片描述

2.详情页

在这里插入图片描述

  到这里,我们就成功地实现了scrapy爬虫之url跟进。
.

六、附录

本文的源码下载(Url文件夹):
https://github.com/AndyofJuly/scrapyDemo

  如果有帮助到你,请点个赞或关注对博主进行鼓励,后续还会继续更新进阶的爬虫案例,有任何疑问请下方评论留言,感谢!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/fallwind_of_july/article/details/97765064

智能推荐

数据库事务的隔离级别_不想承认也不能否认的博客-程序员秘密

数据库事务的隔离级别有4种,由低到高分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable 。而且,在事务的并发操作中可能会出现脏读,不可重复读,幻读。下面通过事例一一阐述它们的概念与联系。Read uncommitted读未提交,顾名思义,就是一个事务可以读取另一个未提交事务的数据。事例:老板要给程序员发工资...

网易云音乐 源码(有图)_网易云音乐源码_宝儿的程序生涯的博客-程序员秘密

http://ustbhuangyi.com/music/#/recommendhttps://music.163.com/m/http://www.tv699.com/[vue全家桶]每个人都能做的网易云音乐https://m.imooc.com/article/22605

1.v-if太多 报错 2. js for循环_v-if用多了_小兔兔吃萝卜的博客-程序员秘密

currentUserInfo: window.localStorage.getItem("currentUserInfo") === "null" ? null : JSON.parse(window.localStorage.getItem("currentUserInfo")),1解决办法:减少不必要的v-if2解决办法:用forEach代替

python/opencv 读取,写入和显示视频_opencv python 写入视频_sda42342342423的博客-程序员秘密

import cv2import numpy as np# Create a VideoCapture object and read from input file# If the input is the camera, pass 0 instead of the video file namecap = cv2.VideoCapture('chaplin.mp4')#cap = ...

java数字家谱管理系统设计与实现计算机毕业设计MyBatis+系统+LW文档+源码+调试部署_计算科技的博客-程序员秘密

java数字家谱管理系统设计与实现计算机毕业设计MyBatis+系统+LW文档+源码+调试部署。springboot基于JavaWeb生鲜OO订购平台的设计与实现。springboot颜如玉图书销售网站的设计与实现。jsp基于JavaWeb的社区商超系统的设计与实现。ssm临港新片区招商引资项目管理系统的设计与实现。JSP网上视频点播系统的设计与实现mysql。ssm基于Vue的去哪儿玩app的设计与实现。ssm基于SSM的仓库管理系统的设计与实现。ssm基于B_S景区票务管理系统设计与实现。

随便推点

AR | 增强现实简述_11Buchichi的博客-程序员秘密

增强现实(Augmented Reality, AR)技术将虚拟对象叠加在真实世界之上,允许用户同时看到虚拟世界和真实世界,可以与虚拟对象进行交互。

远程过程调用-RPC(简单理解)_服务主机远程过程调用(2)是什么意思_L-岁月染过的梦的博客-程序员秘密

RPC:在服务中由第三方完成自己的任务需求的过程,叫做远程过程调用通俗易懂的理解一个阳光明媚的早晨,老婆又在翻看我订阅的技术杂志。“老公,什么是RPC呀,为什么你们程序员那么多黑话!”,老婆还是一如既往的好奇。“RPC,就是Remote Procedure Call的简称呀,翻译成中文就是远程过程调用嘛”,我一边看着书,一边漫不经心的回答着。“啥?你在说啥?谁不知道翻译成中文是什么意思?你个废柴,快给我滚去洗碗!”“我去。。。”,我如梦初醒,我对面坐着的可不是一个程序员,为了不去洗碗,我瞬间调

DNS解析过程详解_dns如何做出权威解析_见证大牛成长之路的博客-程序员秘密

DNS解析过程详解 前言 最近这几天学习一下DNS相关的知识,为啥要学习DNS的知识呢?这个问题问得好,在回答这个问题之前,你得先明白1+1为啥2,如果你明白了,就不需要学DNS了,因为你可以去学数学了,不用走程序员这条路了,如果你不知道1+1为啥等于2,那就来吧,一起学.   根域 就是所谓的’.’(点号),其实我们的网

HDOJ.1070 Milk(贪心)_pengwill97的博客-程序员秘密

Milk点我挑战题目题意分析每组测试数据给出一系列牛奶商品,分别是牛奶的品牌,价格,以及体积。在读取数据的时候,体积在200以下的牛奶直接忽略掉。并且每天要喝200ML的牛奶。但是无论牛奶体积有多么大,牛奶最多喝5天,也就是说每盒牛奶最多喝1000ml,当牛奶的体积不为200整数倍的时候,多余的直接扔掉不喝。现在编写程序挑选出最便宜的牛奶。 贪心策略。 最便宜的就是价钱最低,当然要计算平均某量所

添加原生view_chongxuee5739的博客-程序员秘密

ps:原生view在下层时,按钮等触摸事件会被cocos截断 1.设置cocos的背景为透明(如果原生view在上层的话,无需设置) 在ccc的onLoad()中添加 //cc.director.setClearColor(new cc.Color(0, 0, 0, 0));//cc...

小程序net::ERR_CONNECTION_RESET报错_微信小程序 err_connection_reset 206 (partial content)_晓猿的博客-程序员秘密

用mac本开发微信小程序出现这个报错,网上查了一堆方法,发现没有跨域问题,其他方法也不管用。最后发现还是网络问题。

推荐文章

热门文章

相关标签