Python使用scrapy爬取阳光热线问政平台过程解析


Posted in Python onAugust 14, 2019

目的:爬取阳光热线问政平台问题反映每个帖子里面的标题、内容、编号和帖子url

CrawlSpider版流程如下:

创建爬虫项目dongguang

scrapy startproject dongguang

设置items.py文件

# -*- coding: utf-8 -*-
import scrapy
class NewdongguanItem(scrapy.Item):
  # define the fields for your item here like:
  # name = scrapy.Field()
  # pass
  # 每页的帖子链接
  url = scrapy.Field()
  # 帖子标题
  title = scrapy.Field()
  # 帖子编号
  number = scrapy.Field()
  # 帖子内容
  content = scrapy.Field()

在spiders目录里面,创建并编写爬虫文件sun.py

# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from dongguan.items import DongguanItem
class SunSpider(CrawlSpider):
  name = 'dg'
  allowed_domains = ['wz.sun0769.com']
  start_urls = ['http://wz.sun0769.com/html/top/report.shtml']
  # rules是Rule的集合,每个rule规则同时执行。另外,如果发现web服务器有反爬虫机制如返回一个假的url,则可以使用Rule里面的参数process_links调用一个自编函数来处理url后返回一个真的url
  rules = (
    # 每个url都有一个独一无二的指纹,每个爬虫项目都有一个去重队列
    # Rule里面没有回调函数,则默认对匹配的链接要跟进,就是对匹配的链接在进行请求获取响应后对响应里面匹配的链接继续跟进,只不过没有回调函数对响应数据进行处理
    # Rule(LinkExtractor(allow="page="))如果设置为follow=False,则不会跟进,只显示当前页面匹配的链接。如设置为follow=True,则会对每个匹配的链接发送请求获取响应进而从每个响应里面再次匹配跟进,直至没有。python递归深度默认为不超过1000,否则会报异常
    Rule(LinkExtractor(allow="page=")),

    Rule(LinkExtractor(allow='http://wz.sun0769.com/html/question/\d+/\d+.shtml'),callback='parse_item')

  )

  def parse_item(self, response):
    print(response.url)
    item = DongguanItem()
    item['url'] = response.url
    item['title'] = response.xpath('//div[@class="pagecenter p3"]//strong/text()').extract()[0]
    item['number'] = response.xpath('//div[@class="pagecenter p3"]//strong/text()').extract()[0].split(' ')[-1].split(':')[-1]
     # 对帖子里面有图片的处理,发现没有图片时则没有class="contentext"的div标签,以此作为标准获取帖子内容
    if len(response.xpath('//div[@class="contentext"]')) == 0:
      item['content'] = ''.join(response.xpath('//div[@class="c1 text14_2"]/text()').extract())
    else:
      item['content'] = ''.join(response.xpath('//div[@class="contentext"]/text()').extract())
    yield item

编写管道pipelines.py文件

# -*- coding: utf-8 -*-
import json
class DongguanPipeline(object):
  def __init__(self):
    self.file = open('dongguan.json','w')
  def process_item(self, item, spider):
    content = json.dumps(dict(item),ensure_ascii=False).encode('utf-8') + '\n'
    self.file.write(content)
    return item
  def closespider(self):
    self.file.close()

编写settings.py文件

# -*- coding: utf-8 -*-
BOT_NAME = 'dongguan'
SPIDER_MODULES = ['dongguan.spiders']
NEWSPIDER_MODULE = 'dongguan.spiders'
# log日志文件默认保存在当前目录,下面为日志级别,当大于或等于INFO时将被保存
LOG_FILE = 'dongguan.log'
LOG_LEVEL = 'INFO'
# 爬取深度设置
# DEPTH_LIMIT = 1
# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = 'dongguan (+http://www.yourdomain.com)'
# Obey robots.txt rules
# ROBOTSTXT_OBEY = True
# Configure maximum concurrent requests performed by Scrapy (default: 16)
#CONCURRENT_REQUESTS = 32
# Configure item pipelines
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
  'dongguan.pipelines.DongguanPipeline': 300,
}

测试运行爬虫,终端执行命令(只要在项目目录内即可)

scrapy crawl dg

Spider版流程如下:

创建爬虫项目newdongguang

scrapy startproject newdongguan

设置items.py文件

# -*- coding: utf-8 -*-
  import scrapy
  class NewdongguanItem(scrapy.Item):
    # 每页的帖子链接
    url = scrapy.Field()
    # 帖子标题
    title = scrapy.Field()
    # 帖子编号
    number = scrapy.Field()
    # 帖子内容
    content = scrapy.Field()

在spiders目录里面,创建并编写爬虫文件newsun.py

# -*- coding: utf-8 -*-
import scrapy
from newdongguan.items import NewdongguanItem
class NewsunSpider(scrapy.Spider):
  name = 'ndg'
  # 设置爬取的域名范围,可写可不写,不写则表示爬取时候不限域名,结果有可能会导致爬虫失控。
  allowed_domains = ['wz.sun0769.com']
  offset = 0
  url = 'http://wz.sun0769.com/index.php/question/report?page=' + str(offset)
  start_urls = [url]
  def parse(self, response):
    link_list = response.xpath("//a[@class='news14']/@href").extract()
    for each in link_list:
      # 对每页的帖子发送请求,获取帖子内容里面指定数据返回给管道文件
      yield scrapy.Request(each,callback=self.deal_link)
    self.offset += 30
    if self.offset <= 124260:
      url = 'http://wz.sun0769.com/index.php/question/report?page=' + str(self.offset)
      # 对指定分页发送请求,响应交给parse函数处理
      yield scrapy.Request(url,callback=self.parse)

  # 从每个分页帖子内容获取数据,返回给管道
  def deal_link(self,response):
    item = NewdongguanItem()
    item['url'] = response.url
    item['title'] = response.xpath("//div[@class='pagecenter p3']//strong[@class='tgray14']/text()").extract()[0]
    item['number'] = response.xpath("//div[@class='pagecenter p3']//strong[@class='tgray14']/text()").extract()[0].split(' ')[-1].split(':')[-1]

    if len(response.xpath("//div[@class='contentext']")) == 0:
      item['content'] = ''.join(response.xpath("//div[@class='c1 text14_2']/text()").extract())
    else:
      item['content'] = ''.join(response.xpath("//div[@class='contentext']/text()").extract())
    yield item

编写管道pipelines.py文件

# -*- coding: utf-8 -*-
import codecs
import json
class NewdongguanPipeline(object):

  def __init__(self):
    # 使用codecs写文件,直接设置文件内容编码格式,省去每次都要对内容进行编码
    self.file = codecs.open('newdongguan.json','w',encoding = 'utf-8')
    # 以前文件写法
    # self.file = open('newdongguan.json','w')

  def process_item(self, item, spider):
    print(item['title'])
    content = json.dumps(dict(item),ensure_ascii=False) + '\n'
    # 以前文件写法
    # self.file.write(content.encode('utf-8'))
    self.file.write(content)
    return item

  def close_spider(self):
    self.file.close()

编写settings.py文件

# -*- coding: utf-8 -*-
BOT_NAME = 'newdongguan'
SPIDER_MODULES = ['newdongguan.spiders']
NEWSPIDER_MODULE = 'newdongguan.spiders'
# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = 'newdongguan (+http://www.yourdomain.com)'
USER_AGENT = 'User-Agent:Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;'
# Configure item pipelines
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
  'newdongguan.pipelines.NewdongguanPipeline': 300,
}

测试运行爬虫,终端执行命

srapy crawl ndg

备注:markdown语法关于代码块缩进问题,可通过tab键来解决。而简单文本则可以通过回车键来解决,如Spider版流程如下:和1. 创建爬虫项目newdongguang

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 文件重命名工具代码
Jul 26 Python
使用优化器来提升Python程序的执行效率的教程
Apr 02 Python
python使用urlparse分析网址中域名的方法
Apr 15 Python
python简单获取本机计算机名和IP地址的方法
Jun 03 Python
python脚本设置超时机制系统时间的方法
Feb 21 Python
Python基于ThreadingTCPServer创建多线程代理的方法示例
Jan 11 Python
基于Django URL传参 FORM表单传数据 get post的用法实例
May 28 Python
Python使用sorted对字典的key或value排序
Nov 15 Python
Python Numpy 实现交换两行和两列的方法
Jun 26 Python
如何使用Python 打印各种三角形
Jun 28 Python
Python使用os.listdir和os.walk获取文件路径
May 21 Python
python 偷懒技巧——使用 keyboard 录制键盘事件
Sep 21 Python
用Python抢火车票的简单小程序实现解析
Aug 14 #Python
Python定时任务随机时间执行的实现方法
Aug 14 #Python
查看Python依赖包及其版本号信息的方法
Aug 13 #Python
使用python实现unix2dos和dos2unix命令的例子
Aug 13 #Python
Python编写带选项的命令行程序方法
Aug 13 #Python
使用python模拟命令行终端的示例
Aug 13 #Python
在macOS上搭建python环境的实现方法
Aug 13 #Python
You might like
超神学院:天使彦公认最美的三个视角,网友:我的天使快下凡吧!
2020/03/02 国漫
杏林同学录(九)
2006/10/09 PHP
逆序二维数组插入一元素的php代码
2012/06/08 PHP
php+js实现图片的上传、裁剪、预览、提交示例
2013/08/27 PHP
php数组转换js数组操作及json_encode的用法详解
2013/10/26 PHP
php实用代码片段整理
2016/11/12 PHP
jquery中防刷IP流量软件影响统计的一点对策
2011/07/10 Javascript
jQuery EasyUI API 中文文档 - ComboGrid 组合表格
2011/10/13 Javascript
nodejs 提示‘xxx’ 不是内部或外部命令解决方法
2014/11/20 NodeJs
详解用vue-cli来搭建vue项目和webpack
2017/04/20 Javascript
浅谈函数调用的不同方式,以及this的指向
2017/09/17 Javascript
微信小程使用swiper组件实现图片轮播切换显示功能【附源码下载】
2017/12/12 Javascript
解决jquery的ajax调取后端数据成功却渲染失败的问题
2018/08/08 jQuery
layui实现文件或图片上传记录
2018/08/28 Javascript
vue3.0 CLI - 1 - npm 安装与初始化的入门教程
2018/09/14 Javascript
WebGL three.js学习笔记之阴影与实现物体的动画效果
2019/04/25 Javascript
JS实现可切换图片的幻灯切换效果示例
2019/05/24 Javascript
React Native 混合开发多入口加载方式详解
2019/09/23 Javascript
vue cli3适配所有端方案的实现
2020/04/13 Javascript
JavaScript封装单向链表的示例代码
2020/09/17 Javascript
Python实现的插入排序算法原理与用法实例分析
2017/11/22 Python
利用pandas将numpy数组导出生成excel的实例
2018/06/14 Python
Linux CentOS Python开发环境搭建教程
2018/11/28 Python
Python线程之定位与销毁的实现
2019/02/17 Python
Python中psutil的介绍与用法
2019/05/02 Python
python简单区块链模拟详解
2019/07/03 Python
Python使用shutil模块实现文件拷贝
2020/07/31 Python
英国天然抗衰老护肤品品牌:Nakin Skin Care
2019/04/16 全球购物
四群教育工作实施方案
2014/03/26 职场文书
关于青春的演讲稿
2014/05/05 职场文书
运动会班级口号
2014/06/09 职场文书
关于读书的演讲稿300字
2014/08/27 职场文书
个人培训总结
2015/03/05 职场文书
地道战观后感300字
2015/06/04 职场文书
亲戚关系证明
2015/06/24 职场文书
JavaScript前端面试扁平数据转tree与tree数据扁平化
2022/06/14 Javascript