scrapy爬虫系列之四--爬取列表和详情

摘要:
功能点:如何抓取列表页面并根据列表页面获取详细页面信息?

功能点:如何爬取列表页,并根据列表页获取详情页信息?

爬取网站:东莞阳光政务网

完整代码:https://files.cnblogs.com/files/bookwed/yangguang.zip

主要代码:

yg.py

importscrapy
from yangguang.items importYangguangItem
classYgSpider(scrapy.Spider):
    name = 'yg'
    allowed_domains = ['sun0769.com']
    start_urls = ['http://wz.sun0769.com/index.php/question/report']
    defparse(self, response):
        tr_list = response.xpath("//div[@class='greyframe']/table[2]//tr")
        for tr intr_list:
            item =YangguangItem()
            item["title"] = tr.xpath("./td[2]/a[2]/text()").extract_first()
            item["href"] = tr.xpath("./td[2]/a[2]/@href").extract_first()
            item["status"] = tr.xpath("./td[3]/span/text()").extract_first()
            item["publish_time"] = tr.xpath("./td[last()]/text()").extract_first()
            if type(item["href"]) ==str:
                #请求详情页
                yieldscrapy.Request(
                    item["href"],
                    callback=self.parse_detail,
                    meta={"item": item}
                )
        #翻页
        next_url = response.xpath("//a[text()='>']/@href").extract_first()
        if next_url is notNone:
            yield scrapy.Request(next_url, callback=self.parse)
    #解析详情页
    defparse_detail(self, response):
        item = response.meta["item"]
        #获取详情页的内容、图片
        item["content"] = response.xpath("//div[@class='wzy1']/table[2]//tr[1]/td[@class='txt16_3']/text()").extract()
        item["content_image"] = response.xpath("//div[@class='wzy1']/table[2]//tr[1]/td[@class='txt16_3']//img/@src").extract()
        item["content_image"] = ["http://wz.sun0769.com"+i for i in item["content_image"]]
        yield item  #对返回的数据进行处理

pipelines.py

classYangguangPipeline(object):
    def __init__(self):
        self.f = open('yangguang.json', 'w', encoding='utf-8')
    defprocess_item(self, item, spider):
        item["content"] = self.process_content(item["content"])
        self.f.write(json.dumps(dict(item), ensure_ascii=False) + ',
')
        returnitem
    defprocess_content(self, content):
        #对内容项里的xa0 和 空白字符替换为空
        content = [re.sub(r"xa0|s", "", i) for i incontent]
        #对替换过的空字符串去除
        content = [i for i in content if len(i) >0]
        return content

免责声明:文章转载自《scrapy爬虫系列之四--爬取列表和详情》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇安装openSUSE网卡驱动浅析 Hi MPP 中的 uvc_app下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Ext.js弹窗上传文件

1.构建上传组件 var fileUpload = new Ext.FormPanel({ id:'fileUpload', frame:true, fileUpload:true, items:[{ xtype: 'filefield',...

response 设置响应头的常用几种方法

response 设置响应头的常用几种方法 1.Location 的用法 response.setStatus(302)//临时定向响应码 response.setHeader("Location", "/day03_00_ResponseHeader/servlet/ResponseHeaderDemo2");  ///day03_...

NODE_ENV判断node服务器环境的设置

build->webpack.sit.conf.js 拷贝webpack.prod.conf.js,新建webpack.sit.conf.js、webpack.uait.conf.js,根据环境修改env的引入文件 config->sit.env.js build->bulid.js src -> config文件夹 -&...

Jmeter系列(43)- 详解 Jmeter 图形化 HTML 压测报告之 Charts 模块

如果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html 前言 可以搭配上一篇博客来看哦,是一个整体内容:https://www.cnblogs.com/poloyy/p/13278920.html Charts 介绍 包含了各种详细信息图表,比 GU...

asp.net C#后台实现下载文件的几种方法(全)

protected void Button1_Click(object sender, EventArgs e) { /* 微软为Response对象提供了一个新的方法TransmitFile来解决使用Response.BinaryWrite 下载超过400mb的文件时导致Aspnet_wp.exe进程回收而无法成功下载的问题。 代码如下: */ Res...

mybatis教程:入门>>精通>>实战

以前曾经用过ibatis,这是mybatis的前身,当时在做项目时,感觉很不错,比hibernate灵活。性能也比hibernate好。而且也比较轻量级,因为当时在项目中,没来的及做很很多笔记。后来项目结束了,我也没写总结文档。已经过去好久了。但最近突然又对这个ORM 工具感兴趣。因为接下来自己的项目中很有可能采用这个ORM工具。所以在此重新温习了一下 m...