文章目录

  • 5.2. (scrapy案例二)阳光热线问政平台爬虫
    • 阳光热线问政平台
      • items.py
      • spiders/sunwz.py
          • Spider 版本
          • CrawlSpider 版本
        • pipelines.py
        • settings.py
        • 在项目根目录下新建main.py文件,用于调试
        • 执行程序

5.2. (scrapy案例二)阳光热线问政平台爬虫

阳光热线问政平台

http://wz.sun0769.com/index.php/question/questionType?type=4

爬取投诉帖子的编号、帖子的url、帖子的标题,和帖子里的内容。

items.py

import scrapyclass DongguanItem(scrapy.Item):# 每个帖子的标题title = scrapy.Field()# 每个帖子的编号number = scrapy.Field()# 每个帖子的文字内容content = scrapy.Field()# 每个帖子的urlurl = scrapy.Field()

spiders/sunwz.py

Spider 版本
# -*- coding: utf-8 -*-import scrapy
from dongguan.items import DongguanItemclass SunSpider(CrawlSpider):name = 'sun'allowed_domains = ['wz.sun0769.com']url = 'http://wz.sun0769.com/index.php/question/questionType?type=4&page='offset = 0start_urls = [url + str(offset)]def parse(self, response):# 取出每个页面里帖子链接列表links = response.xpath("//div[@class='greyframe']/table//td/a[@class='news14']/@href").extract()# 迭代发送每个帖子的请求,调用parse_item方法处理for link in links:yield scrapy.Request(link, callback = self.parse_item)# 设置页码终止条件,并且每次发送新的页面请求调用parse方法处理if self.offset <= 71130:self.offset += 30yield scrapy.Request(self.url + str(self.offset), callback = self.parse)# 处理每个帖子里def parse_item(self, response):item = DongguanItem()# 标题item['title'] = response.xpath('//div[contains(@class, "pagecenter p3")]//strong/text()').extract()[0]# 编号item['number'] = item['title'].split(' ')[-1].split(":")[-1]# 文字内容,默认先取出有图片情况下的文字内容列表content = response.xpath('//div[@class="contentext"]/text()').extract()# 如果没有内容,则取出没有图片情况下的文字内容列表if len(content) == 0:content = response.xpath('//div[@class="c1 text14_2"]/text()').extract()# content为列表,通过join方法拼接为字符串,并去除首尾空格item['content'] = "".join(content).strip()else:item['content'] = "".join(content).strip()# 链接item['url'] = response.urlyield item
CrawlSpider 版本
# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from dongguan.items import DongguanItem
import timeclass SunSpider(CrawlSpider):name = 'sun'allowed_domains = ['wz.sun0769.com']start_urls = ['http://wz.sun0769.com/index.php/question/questionType?type=4&page=']# 每一页的匹配规则pagelink = LinkExtractor(allow=('type=4'))# 每个帖子的匹配规则contentlink = LinkExtractor(allow=r'/html/question/\d+/\d+.shtml')rules = [# 本案例为特殊情况,需要调用deal_links方法处理每个页面里的链接Rule(pagelink, process_links = "deal_links", follow = True),Rule(contentlink, callback = 'parse_item')]# 需要重新处理每个页面里的链接,将链接里的‘Type&type=4?page=xxx’替换为‘Type?type=4&page=xxx’(或者是Type&page=xxx?type=4’替换为‘Type?page=xxx&type=4’),否则无法发送这个链接def deal_links(self, links):for link in links:link.url = link.url.replace("?","&").replace("Type&", "Type?")print link.urlreturn linksdef parse_item(self, response):print response.urlitem = DongguanItem()# 标题item['title'] = response.xpath('//div[contains(@class, "pagecenter p3")]//strong/text()').extract()[0]# 编号item['number'] = item['title'].split(' ')[-1].split(":")[-1]# 文字内容,默认先取出有图片情况下的文字内容列表content = response.xpath('//div[@class="contentext"]/text()').extract()# 如果没有内容,则取出没有图片情况下的文字内容列表if len(content) == 0:content = response.xpath('//div[@class="c1 text14_2"]/text()').extract()# content为列表,通过join方法拼接为字符串,并去除首尾空格item['content'] = "".join(content).strip()else:item['content'] = "".join(content).strip()# 链接item['url'] = response.urlyield item

pipelines.py

# -*- coding: utf-8 -*-# 文件处理类库,可以指定编码格式
import codecs
import jsonclass JsonWriterPipeline(object):def __init__(self):# 创建一个只写文件,指定文本编码格式为utf-8self.filename = codecs.open('sunwz.json', 'w', encoding='utf-8')def process_item(self, item, spider):content = json.dumps(dict(item), ensure_ascii=False) + "\n"self.filename.write(content)return itemdef spider_closed(self, spider):self.file.close()

settings.py

ITEM_PIPELINES = {'dongguan.pipelines.DongguanPipeline': 300,
}# 日志文件名和处理等级
LOG_FILE = "dg.log"
LOG_LEVEL = "DEBUG"

在项目根目录下新建main.py文件,用于调试

from scrapy import cmdline
cmdline.execute('scrapy crawl sunwz'.split())

执行程序

py2 main.py

【爬虫学习笔记day44】5.2. (scrapy案例二)阳光热线问政平台爬虫相关推荐

  1. Python:阳光热线问政平台爬虫

    爬取投诉帖子的编号.帖子的url.帖子的标题,和帖子里的内容. items.py import scrapyclass DongguanItem(scrapy.Item):# 每个帖子的标题title ...

  2. 爬虫学习笔记(十)—— Scrapy框架(五):下载中间件、用户/IP代理池、settings文件

    一.下载中间件 下载中间件是一个用来hooks进Scrapy的request/response处理过程的框架. 它是一个轻量级的底层系统,用来全局修改scrapy的request和response. ...

  3. 爬虫学习笔记(七)——Scrapy框架(二):Scrapy shell、选择器

    一.Scrapy shell scrapy shell的作用是用于调试,在项目目录下输入scrapy shell start_urls (start_urls:目标url)得到下列信息: scrapy ...

  4. 爬虫学习笔记(八)—— Scrapy框架(三):CrawSpider模板

    CrawlSpider 创建CrawlSpider 的爬虫文件 命令: scrapy genspider -t crawl 爬虫文件名 域名 Rule 功能:Rule用来定义CrawlSpider的爬 ...

  5. 爬虫学习笔记(六)——Scrapy框架(一):安装、运行流程及简单使用

    文章目录 一.简介 二.安装(Windows) 三.运行流程 3.1.数据流 3.2.组件介绍 3.3.简单使用 3.3.1.项目命令 3.3.2.shell 交互式平台 四.小案例:爬取豆瓣电影 4 ...

  6. python 爬虫 学习笔记(一)Scrapy框架入门

    沉迷于通过高效算法及经典数据结构来优化程序的时候并不理解,为什么多线程可以优化爬虫运行速度?原来是程序特性所决定的:传统算法的程序复杂度主要来源于计算,但网络程序的计算时间可以忽略不计,网络程序所面临 ...

  7. 爬虫学习笔记(十三)—— scrapy-redis(二):存储到MySQL、Scrapy项目部署

    文章目录 一.小案例:爬取纵横小说(RedisCrawlSpider) 1.1.spider文件 1.2.settings文件 二.redis数据存储到MySQL 三.Scrapy 项目部署 3.1. ...

  8. 爬虫学习笔记(十一)—— Scrapy框架(六):媒体管道

    一.媒体管道 1.1.媒体管道的特性 媒体管道实现了以下特性: 避免重新下载最近下载的媒体 指定存储位置(文件系统目录,Amazon S3 bucket,谷歌云存储bucket) 图像管道具有一些额外 ...

  9. 爬虫学习笔记(九)—— Scrapy框架(四):FormRequest、日志

    一.Request Scrapy.http.Request类是scrapy框架中request的基类.它的参数如下: url(字符串) - 此请求的URL callback(callable)- 回调 ...

  10. 爬虫Scrapy框架学习(五)-东莞阳光热线问政平台爬取案例

    本案例通过典型的scrapy框架Spider类展现了一个模板式的爬虫过程,请读者细细体会,此案例为必会项目,按照本博客配置,完美通过.本文还对item做了限制,编写item文件的主要作用是防止爬取数据 ...

最新文章

  1. mount 挂载磁盘报错 mount: wrong fs type, bad option, bad superblock on
  2. iPhone开发教程之Core Data 常见问题的总结
  3. Extjs 入门(03) 折叠||收锉
  4. flask mysql环境配置_Flask干货:访问数据库——Flask-SQLAlchemy初始化
  5. 性能 1.84 倍于 Ceph!网易数帆开源分布式存储系统 Curve
  6. 8 -- 深入使用Spring -- 6...2 Spring支持的事务策略
  7. springboot学习笔记2106版
  8. 批量执行newman
  9. (转载) flex builder
  10. SPSS Modeler 神经网络实践案例(第十四章)
  11. python傅里叶逆变换_Python傅里叶逆变换
  12. 根2是无理数的几种证明方法
  13. 腾讯会议录制视频下载
  14. python生成DataMatrix码(DataMatrix)
  15. Android 实现电话拨号界面带按键声demo
  16. Mac air装 win10 ,总是提示拷贝windows安装文件失败!?
  17. 已知销售额怎么计算成本_知道销售总额怎么计算成本价?
  18. PHP 生成随机昵称或用户名
  19. JVM(二十二) -- 性能监控与调优(三) -- JVM监控及诊断工具--GUI篇
  20. 王杰高中计算机老师,王杰 - 师资概况 - 南方科技大学

热门文章

  1. centos7.4更新安装ssh8.8
  2. 【电路】PT1000/PT100温度采集电路
  3. ubuntu报错:RuntimeError : unexcepted EOF, excepted 2599001 more bytes. The file might be corrupted.
  4. accept搭配用法_accept的固定搭配及用法
  5. DPlayer.js视频播放插件
  6. Backordered even the inventory is sufficient在库存量满足的情况下PICK却BACKORDER
  7. 破解docx文档保护密码
  8. 高通平台紧急呼叫问题总结
  9. 文件怎么复制到虚拟机中的linux系统吗,Windows下的文件如何复制到虚拟机的Linux中...
  10. javascript指定日期增加自然月份(有闰年2月判断)