首页 后端开发 Python教程 Scrapy实现微信公众号文章爬取和分析

Scrapy实现微信公众号文章爬取和分析

Jun 22, 2023 am 09:41 AM
微信公众号 分析。 scrapy

Scrapy实现微信公众号文章爬取和分析

微信是近年来备受欢迎的社交媒体应用,在其中运营的公众号也扮演着非常重要的角色。众所周知,微信公众号是一个信息和知识的海洋,因为其中每个公众号都可以发布文章、图文消息等信息。这些信息可以被广泛地应用在很多领域中,比如媒体报道、学术研究等。

那么,本篇文章将介绍如何使用Scrapy框架来实现微信公众号文章的爬取和分析。Scrapy是一个Python的网络爬虫框架,其主要功能是进行数据挖掘和信息查找。因此,Scrapy具有很好的可定制性和高效性。

  1. 安装Scrapy并创建项目

要使用Scrapy框架进行爬虫,首先需要安装Scrapy和其他依赖项。可以使用pip命令进行安装,安装过程如下所示:

pip install scrapy
pip install pymongo
pip install mysql-connector-python
登录后复制

安装Scrapy之后,我们需要使用Scrapy命令行工具来创建项目。命令如下:

scrapy startproject wechat
登录后复制

执行该命令后,Scrapy将会创建一个名为“wechat”的项目,并在项目目录中创建许多文件和目录。

  1. 实现微信公众号文章的爬取

在我们开始爬虫之前,我们需要先搞懂微信公众号文章页面的URL格式。一个典型的微信公众号文章页面的URL长这样:

https://mp.weixin.qq.com/s?__biz=XXX&mid=XXX&idx=1&sn=XXX&chksm=XXX#wechat_redirect
登录后复制

其中,__biz 表示微信公众号的ID,mid 表示文章的ID,idx 表示文章的序号,sn 表示文章的签名,chksm 表示内容校验。因此,如果我们要爬取某个公众号的所有文章,就需要找到这个公众号的ID,并用它来构建URL。其中,biz_id 是该公众号的唯一标识。

首先,我们需要准备一个包含许多公众号ID的列表,因为我们要爬取这些公众号的文章。而ID的搜集可以通过各种手段来实现。在这里,我们使用一个包含几个测试ID的列表作为例子:

biz_ids = ['MzU5MjcwMzA4MA==', 'MzI4MzMwNDgwMQ==', 'MzAxMTcyMzg2MA==']
登录后复制

接着,我们需要编写一个Spider,来爬取某个公众号的所有文章。这里,我们将公众号的名字和ID传递到Spider,以方便我们可以处理不同的公众号ID。

import scrapy
import re

class WeChatSpider(scrapy.Spider):
    name = "wechat"
    allowed_domains = ["mp.weixin.qq.com"]
    
    def __init__(self, name=None, biz_id=None):
        super().__init__(name=name)
        self.start_urls = ['https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz={}==#wechat_redirect'.format(biz_id)]

    def parse(self, response):
        article_urls = response.xpath('//h4[1]/a/@href')
        for url in article_urls.extract():
            yield scrapy.Request(url, callback=self.parse_article)
        
        next_page = response.xpath('//a[@id="js_next"]/@href')
        if next_page:
            yield scrapy.Request(response.urljoin(next_page[0].extract()), callback=self.parse)
    
    def parse_article(self, response):
        url = response.url
        title = response.xpath('//h2[@class="rich_media_title"]/text()')
        yield {'url': url, 'title': title.extract_first().strip()}
登录后复制

Spider的主要功能是使用给定的公众号ID来访问公众号首页,然后递归地遍历每一页,提取所有文章的URL。此外,parse_article方法用于提取文章的URL和标题,以进行后续处理。总体而言,该Spider不是很复杂,但是提取速度较慢。

最后,我们需要在Terminal中输入下面的命令来启动Spider:

scrapy crawl wechat -a biz_id=XXXXXXXX
登录后复制

同样,我们也可以爬取多个公众号,只需要在命令中指定所有公众号的ID即可:

scrapy crawl wechat -a biz_id=ID1,ID2,ID3
登录后复制
  1. 存储文章数据

爬取文章之后,我们需要将文章的标题和URL保存到数据库(如MongoDB、MySQL等)。在这里,我们将使用pymongo库来保存爬取到的数据。

import pymongo

class MongoPipeline(object):
    collection_name = 'wechat'

    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_DATABASE', 'items')
        )

    def open_spider(self, spider):
        self.client = pymongo.MongoClient(self.mongo_uri)
        self.db = self.client[self.mongo_db]

    def close_spider(self, spider):
        self.client.close()

    def process_item(self, item, spider):
        self.db[self.collection_name].insert_one(dict(item))
        return item
登录后复制

在该Pipeline中,我们使用了MongoDB作为存储数据的后端。可以根据需要修改这个类来使用其他的数据库系统。

接下来,我们需要在settings.py文件中配置数据库相关的参数:

MONGO_URI = 'mongodb://localhost:27017/'
MONGO_DATABASE = 'wechat'
ITEM_PIPELINES = {'myproject.pipelines.MongoPipeline': 300}
登录后复制

最后,我们在Spider中调用Pipeline,以将数据存储到MongoDB中:

class WeChatSpider(scrapy.Spider):
    name = "wechat"
    allowed_domains = ["mp.weixin.qq.com"]
    
    def __init__(self, name=None, biz_id=None):
        super().__init__(name=name)
        self.start_urls = ['https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz={}==#wechat_redirect'.format(biz_id)]

    def parse(self, response):
        article_urls = response.xpath('//h4[1]/a/@href')
        for url in article_urls.extract():
            yield scrapy.Request(url, callback=self.parse_article)
        
        next_page = response.xpath('//a[@id="js_next"]/@href')
        if next_page:
            yield scrapy.Request(response.urljoin(next_page[0].extract()), callback=self.parse)
            
    def parse_article(self, response):
        url = response.url
        title = response.xpath('//h2[@class="rich_media_title"]/text()')
        yield {'url': url, 'title': title.extract_first().strip()}

        pipeline = response.meta.get('pipeline')
        if pipeline:
            item = dict()
            item['url'] = url
            item['title'] = title.extract_first().strip()
            yield item
登录后复制

在上面的代码中,response.meta.get('pipeline')是用来获取我们在Spider中设置的Pipeline的对象的。因此,只需在Spider代码中添加如下代码,就可以支持Pipeline了:

yield scrapy.Request(url, callback=self.parse_article, meta={'pipeline': 1})
登录后复制
  1. 数据分析

最后,我们将使用Scrapy和pandas等库来实现数据的分析和可视化。

在这里,我们将从MongoDB中提取我们爬取到的数据,并将其保存到CSV文件中。随后,我们可以使用pandas来对CSV文件进行处理,并进行可视化。

以下是实现过程:

import pandas as pd
from pymongo import MongoClient

client = MongoClient('mongodb://localhost:27017/')
db = client['wechat']
articles = db['wechat']

cursor = articles.find()
doc = list(cursor)

df = pd.DataFrame(doc)
df.to_csv('wechat.csv', encoding='utf-8')

df.groupby('biz_id')['title'].count().plot(kind='bar')
登录后复制

以上代码中,我们使用了 MongoDB 和 Pandas 库来将爬取到的数据保存到 CSV 文件的 data 文件夹内。随后,我们使用 Pandas 强大的数据分析功能将每个公众号的文章数量进行了可视化展示。

以上是Scrapy实现微信公众号文章爬取和分析的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Scrapy实现微信公众号文章爬取和分析 Scrapy实现微信公众号文章爬取和分析 Jun 22, 2023 am 09:41 AM

Scrapy实现微信公众号文章爬取和分析微信是近年来备受欢迎的社交媒体应用,在其中运营的公众号也扮演着非常重要的角色。众所周知,微信公众号是一个信息和知识的海洋,因为其中每个公众号都可以发布文章、图文消息等信息。这些信息可以被广泛地应用在很多领域中,比如媒体报道、学术研究等。那么,本篇文章将介绍如何使用Scrapy框架来实现微信公众号文章的爬取和分析。Scr

Scrapy基于Ajax异步加载实现方法 Scrapy基于Ajax异步加载实现方法 Jun 22, 2023 pm 11:09 PM

Scrapy是一个开源的Python爬虫框架,它可以快速高效地从网站上获取数据。然而,很多网站采用了Ajax异步加载技术,使得Scrapy无法直接获取数据。本文将介绍基于Ajax异步加载的Scrapy实现方法。一、Ajax异步加载原理Ajax异步加载:在传统的页面加载方式中,浏览器发送请求到服务器后,必须等待服务器返回响应并将页面全部加载完毕才能进行下一步操

Scrapy案例解析:如何抓取LinkedIn上公司信息 Scrapy案例解析:如何抓取LinkedIn上公司信息 Jun 23, 2023 am 10:04 AM

Scrapy是一个基于Python的爬虫框架,可以快速而方便地获取互联网上的相关信息。在本篇文章中,我们将通过一个Scrapy案例来详细解析如何抓取LinkedIn上的公司信息。确定目标URL首先,我们需要明确我们的目标是LinkedIn上的公司信息。因此,我们需要找到LinkedIn公司信息页面的URL。打开LinkedIn网站,在搜索框中输入公司名称,在

微信公众号认证和不认证有哪些区别 微信公众号认证和不认证有哪些区别 Sep 19, 2023 pm 02:15 PM

微信公众号认证和不认证的区别在认证标识、功能权限、推送频率、接口权限和用户信任度等方面。详细介绍:1、认证标识,认证公众号会获得官方颁发的认证标识,即蓝色V标志,这个标志可以增加公众号的可信度和权威性,让用户更容易辨别真实的官方公众号;2、功能权限,认证公众号相比未认证的公众号拥有更多的功能和权限,例如认证公众号可以申请开通微信支付功能,实现在线支付和商业化运营等等。

Scrapy优化技巧:如何减少重复URL的爬取,提高效率 Scrapy优化技巧:如何减少重复URL的爬取,提高效率 Jun 22, 2023 pm 01:57 PM

Scrapy是一个功能强大的Python爬虫框架,可以用于从互联网上获取大量的数据。但是,在进行Scrapy开发时,经常会遇到重复URL的爬取问题,这会浪费大量的时间和资源,影响效率。本文将介绍一些Scrapy优化技巧,以减少重复URL的爬取,提高Scrapy爬虫的效率。一、使用start_urls和allowed_domains属性在Scrapy爬虫中,可

在Scrapy爬虫中使用Selenium和PhantomJS 在Scrapy爬虫中使用Selenium和PhantomJS Jun 22, 2023 pm 06:03 PM

在Scrapy爬虫中使用Selenium和PhantomJSScrapy是Python下的一个优秀的网络爬虫框架,已经被广泛应用于各个领域中的数据采集和处理。在爬虫的实现中,有时候需要模拟浏览器操作去获取某些网站呈现的内容,这时候就需要用到Selenium和PhantomJS。Selenium是模拟人类对浏览器的操作,让我们可以自动化地进行Web应用程序测试

深度使用Scrapy:如何爬取HTML、XML、JSON数据? 深度使用Scrapy:如何爬取HTML、XML、JSON数据? Jun 22, 2023 pm 05:58 PM

Scrapy是一款强大的Python爬虫框架,可以帮助我们快速、灵活地获取互联网上的数据。在实际爬取过程中,我们会经常遇到HTML、XML、JSON等各种数据格式。在这篇文章中,我们将介绍如何使用Scrapy分别爬取这三种数据格式的方法。一、爬取HTML数据创建Scrapy项目首先,我们需要创建一个Scrapy项目。打开命令行,输入以下命令:scrapys

如何使用Laravel开发一个基于微信公众号的在线点餐系统 如何使用Laravel开发一个基于微信公众号的在线点餐系统 Nov 02, 2023 am 09:42 AM

如何使用Laravel开发一个基于微信公众号的在线点餐系统随着微信公众号的广泛应用,越来越多的企业开始将其作为在线营销的重要渠道。在餐饮行业中,开发一个基于微信公众号的在线点餐系统能够提高企业的效率和销售额。本文将介绍如何使用Laravel框架来开发一个这样的系统,并提供具体的代码示例。项目准备首先,需要确保已经在本地环境中安装好了Laravel框架。可以通

See all articles