【scrapy实战】获取我的博客信息

需求

之前写过一个blog,是通过基本的bs4完成爬取的:
传送门
这样写动态爬虫的缺点包括:
1.速度慢
2.需要额外的解析
3.要额外判断blink信息,没有容错机制

因此,我们考虑使用scrapy框架,源码在我的github仓库
scrapy爬取博客源码

scrapy框架

scrapy框架是一个全家桶爬虫
item定义需要爬取的对象和属性
pipeline定义过滤规则
settings定义配置信息
article是爬虫程序,定义如何迭代访问不同的url

核心就是article的编写!!

【scrapy实战】获取我的博客信息

; 关于scrapy的创建

1.首先是下载scrapy库
2.创建一个scrapy项目

scrapy startproject 项目名

3.创建一个爬虫脚本

scrapy genspider article 主网页名

完成了以上三步之后就可以开始编写scrapy项目了

定义items对象


import scrapy

class Article(scrapy.Item):

    title = scrapy.Field()
    read = scrapy.Field()
    like = scrapy.Field()
    review = scrapy.Field()
    collect = scrapy.Field()

我们需要爬取的是文章信息,这里我们定义了题目、浏览量、点赞量、评论量和收藏量

最核心的爬虫脚本(这里是article.py)

1.首先,我们需要定义主网站和起始网站

    name = 'article'
    allowed_domains = ['blog.csdn.net']

    start_urls = ['https://blog.csdn.net']

2.整理一下我们的逻辑(看一下文章顶的链接,另一篇动态爬虫的文章有详细解释)
先通过api获取所有的文章url信息,所以我们需要定义一个函数来浏览全部api,把所有文章url存起来

3.获取全部文章的url


    def get_all_my_articles(self):
        article_urls = []
        header = {
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36',
            'referer': 'https://bridge-killer.blog.csdn.net/'
        }
        menu_url = "https://blog.csdn.net/community/home-api/v1/get-business-list?page={}&size=20&businessType=lately&noMore=false&username=weixin_40986490"

        for page in range(1, 44):
            r = requests.get(menu_url.format(page), headers = header)
            for article in r.json()['data']['list']:
                article_urls.append(article['url'])

        return article_urls

4.文章页的解析(这里可以结合scrapy shell 验证reponse.css的结果,也可以通过”检查”中的元素复制css选择器结果)
这一步是关键的一步,需要分析目标网页

    def parse_article(self, response):
        article = Article()
        article['title'] = response.css('#articleContentId::text').get()
        article['read'] = response.css('.read-count::text').get()
        article['like'] = response.css('#spanCount::text').get().strip()
        article['review'] = response.css('li.tool-item:nth-child(3) > a:nth-child(1) > span:nth-child(2)::text').get().strip()
        article['collect'] = response.css('#get-collection::text').get().strip()

        yield article

5.迭代遍历全部的博客url,使用parse(override)

    def parse(self, response):
        article_urls = self.get_all_my_articles()
        for article_url in article_urls:
            yield response.follow(article_url, self.parse_article)

过滤

好了,我们获取完全部的信息后,可以过滤一下:
假如我们只要记录200阅读量以上的文章,就可以使用DropItems来完成
这里是pipelines.py

from scrapy.exceptions import DropItem

class MyblogPipeline:
    def process_item(self, item, spider):

        if item.get('read'):

            item['read'] = int(item['read'])

            if item['read'] < 200:
                raise DropItem('去掉200阅读量以下的文章')

        return item

存储和配置

settings.py


ITEM_PIPELINES = {

  'myBlog.pipelines.MyblogPipeline': 300,

}

FEED_FORMAT = 'csv'

FEED_URI = 'my_blog_articles.csv'

AUTOTHROTTLE_ENABLED = True

AUTOTHROTTLE_TARGET_CONCURRENCY = 5

这里的配置提供了存储的格式和文件名,以及并发数

成果

【scrapy实战】获取我的博客信息
得到一个csv文件

; 总结

scrapy是一个保姆式的爬虫框架
我们只需要定义数据格式,定义url抓取顺序,然后再定义数据过滤模式,和数据存储方式即可
简化了很多逻辑,关键是如何分析页面,通过response.css获取对应的元素

Original: https://blog.csdn.net/weixin_40986490/article/details/123553012
Author: 白速龙王的回眸
Title: 【scrapy实战】获取我的博客信息

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/788659/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 程序员防内卷小游戏2之代码实现

    老规律,我们用pygame库来进行开发 初始化代码分为:1.创建主游戏窗口2.创建游戏的时钟3.创建精灵和精灵族4.设置定时器事件,来创建敌人和子弹的事件 具体代码如下:先定义一个…

    Python 2023年9月20日
    040
  • flask使用pyinstaller打包成exe文件,config和pymysql报错情况处理

    首先以下是flask系统文件目录,其中config.py文件在app目录层级下: 1、使用pyinstaller -F run.py,出现报错提示:No module named …

    Python 2023年8月13日
    070
  • anaconda管理包

    查看已安装的包 conda list 查看特定环境已安装的包 conda list -n python 查找包的信息 conda search pygame 安装包 可以使用-n来…

    Python 2023年9月24日
    038
  • 天池赛:宝可梦数据分析–龙系小精灵分享

    目录 一、数据集介绍 二、数据探索 1.数据相关性 2.查看各个种族的属性总值分布 3.种族属性雷达图 三、总体可视化展示 四、龙系宝可梦数据可视化展示 附录 1、龙系宝可梦属性图…

    Python 2023年8月7日
    059
  • python旋转数组_旋转numpy二维数组

    我想借助上面的例子来解决这个问题: &13; &13; import pandas as pd import numpy as np bd = np.matrix(…

    Python 2023年8月8日
    044
  • 互异数

    这道题是实验舱举办的”编程一小时”千人马拉松竞赛的第三题! 目录 #C、互异数 题目描述 输入格式 输出格式 输入样例1 输出样例1 输入样例2 输出样例2…

    Python 2023年9月17日
    046
  • keras环境搭建

    操作系统 : CentOS7.5.1804_x64 Python 版本 : 3.6.8 keras + tensorflow 环境搭建,使用cpu,安装命令如下: virtuale…

    Python 2023年6月12日
    082
  • [nginx]编译安装openresty

    基于 debian11 编译安装 openresty 前言 OpenResty是一个基于Nginx和Lua的高性能Web平台,其内部集成了大量精良的Lua库、第三方模块以及大多数的…

    Python 2023年6月12日
    096
  • matplotlib详细教学

    Matplotlib初相识 认识matplotlib Matplotlib是一个Python 2D绘图库,能够以多种硬拷贝格式和跨平台的交互式环境生成出版物质量的图形,用来绘制各种…

    Python 2023年10月30日
    040
  • BUUCTF misc第二页WP

    目录 梅花香之苦寒来 just_a_rar 鸡你太美 神奇的二维码 一叶障目 穿越时空的思念 纳尼 outguess 我有一只马里奥 谁赢了比赛? 来题中等的吧 gakki fin…

    Python 2023年9月1日
    064
  • Monaco Editor 中的 Keybinding 机制

    一、前言 前段时间碰到了一个 Keybinding 相关的问题,于是探究了一番,首先大家可能会有两个问题:Monaco Editor 是啥?Keybinding 又是啥? Mona…

    Python 2023年10月20日
    027
  • Flask 物联网局部应用情景

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

    Python 2023年8月15日
    041
  • 一个有趣的nginx HTTP 400响应问题分析

    &#x5BF9;&#x4E8E;query&#x53C2;&#x6570;&#x5E26;&#x7A7A;&#x683C;&…

    Python 2023年10月13日
    060
  • python 读取配置文件的单元测试_Python3.8+Pytest+Allure单元测试框架搭建

    TestNG报告太丑? 测试结果维度展现有限? 无法区分用例优先级? 不方便查看错误信息? Allure测试报告框架帮助你轻松实现”高大上”报告展示。本文通…

    Python 2023年9月13日
    043
  • Linux进程间通信(二)

    信号 信号的概念 信号是Linux进程间通信的最古老的一种方式。信号是软件中断,是一种异步通信的方式。信号可以导致一个正在运行的进程被另一个正在运行的异步进程中断,转而处理某个突发…

    Python 2023年10月17日
    037
  • 2.pytest之用例的运行方式

    pytest之用例的运行方式 主函数模式 命令行模式 配置文件 1.主函数模式 运行所有: pytest.main() 指定模块运行: pytest.main([&#x20…

    Python 2023年9月11日
    052
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球