[爬虫笔记02] Scrapy爬取阳光问政平台

1.爬取分析

打开阳光问政平台的最新问政板块,可以看到问政问题列表。
在这里插入图片描述
打开浏览器开发者工具,每个问题的内容就放在< li >标签中,我们要提取span里的内容。
在这里插入图片描述
将网页滑到最下面,可以看到翻页条,我们要提取下一页的链接进行翻页。
在这里插入图片描述
< a >标签中的链接即为下一页的链接。
在这里插入图片描述
点击其中一个问题的链接,打开详情页。
在这里插入图片描述
我们要提取< pre >标签中的内容。
在这里插入图片描述
爬取思路:

  1. 提取主页的每条问题的编号、问政标题、问题链接等内容
  2. 打开每条问题的详情页,提取问题详细内容
  3. 循环翻页爬取

2.代码实现

(1)创建项目
创建一个新的Scrapy项目,进入自定义的项目目录中,运行下列命令:

scrapy startproject sunwz

进入sunwz目录,创建一个名为sun的爬虫,运行下列命令:

scrapy genspider sun "sun0769.com"

(2)修改items.py

import scrapy


class SunwzItem(scrapy.Item):
    number = scrapy.Field() #编号
    status = scrapy.Field() #状态
    title = scrapy.Field()  #问政标题
    response_time = scrapy.Field()  #响应时间
    question_time = scrapy.Field()  #问政时间
    question_link = scrapy.Field() #问题链接
    content = scrapy.Field() #问题内容

(3)修改sun.py
基本逻辑是:使用parse方法解析主页数据,然后打开详情页,调用parse_detail方法解析详情页数据,最后将item返回,每一个item就是一个问题。

import scrapy
from sunwz.items import SunwzItem

class SunSpider(scrapy.Spider):
    name = 'sun'
    allowed_domains = ['sun0769.com']
    start_urls = ['http://wz.sun0769.com/political/index/politicsNewest?id=1']
    base_url = 'http://wz.sun0769.com'

    def parse(self, response):
        questions = response.css('.title-state-ul .clear')
        for question in questions:
            item = SunwzItem()
            item['number'] = question.css('.state1::text').extract_first()
            item['status'] = question.css('.state2::text').extract_first().strip()
            item['title'] = question.css('.state3 .color-hover::text').extract_first()
            item['response_time'] = question.css('.state4::text').extract_first().strip()
            item['question_time'] = question.css('.state5::text').extract_first()
            item['question_link'] = self.base_url + question.css('.state3 .color-hover::attr(href)').extract_first()
            
            yield scrapy.Request(url=item['question_link'], callback=self.parse_detail, meta={'item': item})
        
        next = response.css('.arrow-page.prov_rota::attr(href)').extract_first()
        url = self.base_url + next
        yield scrapy.Request(url=url, callback=self.parse)
    
    def parse_detail(self, response):
        item = response.meta['item']
        item['content'] = response.css('.details-box pre::text').extract_first()
        yield item

(4)保存为csv
运行下面命令,可将提取到的数据保存到csv文件。

scrapy crawl sun -o sun.csv

在这里插入图片描述
在这里插入图片描述
(5)保存到MongoDB
修改settings.py

SPIDER_MODULES = ['sunwz.spiders']
NEWSPIDER_MODULE = 'sunwz.spiders'

MONGO_URI = 'localhost'
MONGO_DB = 'sunwz'	#数据库名
ITEM_PIPELINES = {
    'sunwz.pipelines.SunwzPipeline': 300,
    'sunwz.pipelines.MongoPipeline': 400,
}

修改pipelines.py

import pymongo

class SunwzPipeline(object):
    
    def process_item(self, item, spider):
        return item

class MongoPipeline(object):
    
    def __init__(self, mongo_uri, mongo_db):
        self.mongo_uri = mongo_uri
        self.mongo_db = mongo_db
    
    @classmethod
    def from_crawler(cls, crawler):
        return cls(
            mongo_uri = crawler.settings.get('MONGO_URI'),
            mongo_db = crawler.settings.get('MONGO_DB')
                )
    
    def open_spider(self, spider):
        self.client = pymongo.MongoClient(self.mongo_uri)
        self.db = self.client[self.mongo_db]
        
    def process_item(self, item, spider):
        name = item.__class__.__name__
        self.db[name].insert(dict(item))
        return item
    
    def close_spider(self, spider):
        self.client.close()

MongoDB数据库中的数据。
在这里插入图片描述

3.制作词云图

import csv
import matplotlib.pyplot as plt
import jieba
from wordcloud import WordCloud

#1.读出
text = ''
csv_file = csv.reader(open('sun.csv',encoding='utf-8'))
for row in csv_file:
    text = text + row[0]
#2.剪开
cut_text = jieba.cut(text)
stopwords = {'可以','已经','这些','虽然','如果','这个','所以','现在',
            '不是','怎么','甚至','时候','没有','什么','大家','自己',
            '还是','不能','需要','为什么','而且','开始','一直','他们',
            '或者','应该','我们','你们','但是','因为','这样','还有'}
cuttext = [i for i in cut_text if i not in stopwords]
#3.以空格拼接起来
result = " ".join(cuttext)
#生成词云
wc = WordCloud(
    font_path='C:/Windows/fonts/simhei.ttf',     #字体路径
    background_color='white',   #背景颜色
    width=1000,
    height=600,
    max_font_size=50,            #字体大小
    min_font_size=10,
    mask=plt.imread('bg.jpg'), #背景图片
    max_words=1000
)
wc.generate(result)
wc.to_file('wordcloud.png') #图片保存

在这里插入图片描述

4.Scrapy知识补充

(1)常用命令

  1. startproject
scrapy startproject example
  1. genspider
scrapy genspider example "example.com"
  1. runspider
scrapy runspider example
  1. shell
scrapy shell http://www.baidu.com

之后可以直接执行命令

response.css("title").extract_first()
  1. fetch
scrapy fetch http://www.baidu.com
  1. crawl
scrapy crawl example

(2)CSS选择器

  1. 基本格式
response.css('.classname::text').extract_first()	#根据class提取文本
response.css('.classname1.classname2::text').extract_first()	#有两个class
response.css('p::text').extract_first()	#根据标签提取文本
response.css('a::attr(href)').extract_first()	#提取属性
  1. 高级用法
    在这里插入图片描述
    在这里插入图片描述
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python爬虫Scrapy是一种用于爬取网站数据的工具。它可以自动化地从网站上获取数据,并将其存储在本地或远程服务器上。Scrapy使用Python编写,具有高效、灵活和可扩展的特点,可以处理大量数据和复杂的网站结构。使用Scrapy可以快速地获取所需的数据,从而为数据分析和挖掘提供支持。 ### 回答2: Python爬虫是一种快速、高效的网络爬虫工具,它利用Python语言及其强大的第三方库实现自动化爬取互联网信息的过程。而Scrapy是一个Python爬虫框架,可以帮助我们快速构建持续性的爬虫应用程序。 基于Scrapy框架的爬虫程序设计,首先需要明确自己的目标:确定目标网站、确定目标页面、确定目标信息。其次,在编写程序之前,我们需要构建好爬虫的数据模型,包括目标页面的结构、目标信息的抽取规则等。Scrapy框架的核心就是Spider,将会快速地处理目标页面,解析数据并且提取出所需信息。这些信息可以经过清洗、存储和分析等处理过程,最终达到我们的预期需求。 爬虫程序的主要步骤是: 1.创建一个Scrapy项目,包括spider、items、pipelines等。 2.定义spider,包括start_urls、parse等。 3.定义item,表示解析结果的结构。 4.定义pipeline,用于处理抓取到的数据。 5.运行爬虫程序并保存数据。 在使用Scrapy进行网络爬虫时,需要遵守相关法律法规,尊重目标网站的利益和知识产权,不进行违法、违规的操作,同时遵守robots.txt协议等规定,如不得爬取不允许抓取的页面。 总之,对于想要进行网络数据采集的人来说,Scrapy是一个非常强大的Python爬虫框架。它支持异步IO和协程等功能,可以快速、高效地提取目标数据。但是,使用Scrapy时需要遵循规则,合理利用,不进行违法、违规操作。 ### 回答3: Scrapy是基于Python语言的爬虫框架,它可以更好的帮我们实现爬取网站的任务。scrapy提供了一整套爬虫流程和一些基本机制,比如:异步处理,中间件机制,数据管道,数据解析等等。这些机制可以帮我们更加简便和高效地进行网络爬取任务。 使用Scrapy爬取网站有以下几个步骤: 1. 安装Scrapy框架 我们需要提前安装好PythonScrapy框架。安装Scrapy比较方便,可以通过pip来安装,命令为:pip install scrapy。 2. 创建scrapy爬虫工程 我们需要使用scrapy startproject 项目名的命令来创建项目,并进入到项目的工程目录来创建爬虫内容,命令为:scrapy genspider 爬虫名 域名。 3. 配置scrapy爬虫的设置 进入到Scrapy工程目录,找到settings.py文件,修改里面的文件配置,包括:User-Agent,爬虫间隔时间,ip代理池设置等等。 4. 配置scrapy爬虫的项 在Spider中定义需要爬取的网站信息,包括URL地址和需要获取的数据。 5. 实现URL地址的解析 在Spider中写解析函数,对爬虫获取到的URL进行解析,获取需要的数据内容。 6. 爬虫启动 最后,使用命令scrapy crawl 爬虫名,启动爬虫爬取的URL资源会被输出进行。如果爬虫爬取的URL过多,那么可以使用命令scrapy crawl 爬虫名 -o 文件名.格式名来保存爬虫获取到的数据内容。 总的来说,Scrapy是一个快速高效的爬虫框架,有着多种策略来处理不同种类的爬虫需求。使用Scrapy进行爬虫的开发,不仅能够为我们省去很多重复性工作,还能够提高我们的开发效率和爬虫的运行效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值