首页 > 编程语言 >Python爬虫实战系列1:博客园cnblogs热门新闻采集

Python爬虫实战系列1:博客园cnblogs热门新闻采集

时间:2024-03-13 09:25:04浏览次数:36  
标签:__ cnblogs Python 博客园 news div com class

实战案例:博客园热门新闻采集

一、分析页面

打开博客园网址https://www.cnblogs.com/,点击【新闻】再点击【本周】

今日新闻.png

本次采集,我们以页面新闻标题为案例来采集。这里可以看到标题“ 李彦宏:以后不会存在“程序员”这种职业了”。

1.1、分析请求

F12打开开发者模式,然后点击Network后点击任意一个请求,Ctrl+F开启搜索,输入标题李彦宏:以后不会存在“程序员”这种职业了 ,开始搜索

请求分析.png

可以看到请求地址为https://news.cnblogs.com/n/digg?type=week 但是返回的内容不是json格式,而是html源码,说明该页面是博客园后端拼接html源码返回给前端的,这里我们就不能简单的直接通过API接口来获取数据了,还需要对html源码进行解析。

1.2、分析页面

点击查看元素,然后点击新闻标题。

页面源码.png

对应的html源码是<a href="/n/766062/" target="_blank">李彦宏:以后不会存在“程序员”这种职业了</a>

通过源码我们可以看出,标题是被一个id=news_list的div包裹,然后news_div下还有news_block这个div包裹,然后是逐级向下,一直到a标签才是我们想要的数据。

标题源码分析.png

1.3、分页信息处理

分页信息.png

通过页面分析,可以看到分页很简单,直接在Query String QueryParamters里传入type: week、page: 2两个参数即可。

1.4、判断反爬及cookie

如何判断该请求需要哪些header和cookie参数?或者有没有反爬策略

copy_curl.png

首先拷贝curl,在另一台机器上运行,curl代码如下

curl代码.png

通过逐步删除代码中header参数来判断哪些是必要的参数,首先把cookie参数删除试试,发现可以获取到结果。由此判断,该网站没有设置cookie请求机制。

那就很简单了,直接发请求,解析html源码。

二、代码实现

新建Cnblogs类,并在init里设置默认header参数

class Cnblogs:
    def __init__(self):
        self.headers = {
            'authority': 'news.cnblogs.com',
            'referer': 'https://news.cnblogs.com/n/digg?type=yesterday',
            'user-agent': USERAGENT
        }

新建获取新闻get_news函数

def get_news(self):
    result = []
    for i in range(1, 4):
        url = f'https://news.cnblogs.com/n/digg?type=today&page={i}'
        content = requests.get(url)
        html = etree.HTML(content.text)
        news_list = html.xpath('//*[@id="news_list"]/div[@class="news_block"]')
        for new in news_list:
            title = new.xpath('div[@class="content"]/h2[@class="news_entry"]/a/text()')
            push_date = new.xpath('div[@class="content"]/div[@class="entry_footer"]/span[@class="gray"]/text()')
            result.append({
                "news_title": str(title[0]),
                "news_date": str(push_date[0]),
                "source_en": spider_config['name_en'],
                "source_cn": spider_config['name_cn'],
            })
    return result

代码主要使用了requests和lxml两个库来实现

测试运行

def main():
    cnblogs = Cnblogs()
    results = cnblogs.get_news()
    print(results)


if __name__ == '__main__':
    main()

程序运行效果.png

完整代码

# -*- coding: utf-8 -*-

import os
import sys

import requests
from lxml import etree

opd = os.path.dirname
curr_path = opd(os.path.realpath(__file__))
proj_path = opd(opd(opd(curr_path)))
sys.path.insert(0, proj_path)

from app.utils.util_mysql import db
from app.utils.util_print import Print
from app.conf.conf_base import USERAGENT

spider_config = {
    "name_en": "https://news.cnblogs.com",
    "name_cn": "博客园"
}


class Cnblogs:
    def __init__(self):
        self.headers = {
            'authority': 'news.cnblogs.com',
            'referer': 'https://news.cnblogs.com/n/digg?type=yesterday',
            'user-agent': USERAGENT
        }

    def get_news(self):
        result = []
        for i in range(1, 4):
            url = f'https://news.cnblogs.com/n/digg?type=week&page={i}'
            content = requests.get(url)
            html = etree.HTML(content.text)
            news_list = html.xpath('//*[@id="news_list"]/div[@class="news_block"]')
            for new in news_list:
                title = new.xpath('div[@class="content"]/h2[@class="news_entry"]/a/text()')
                push_date = new.xpath('div[@class="content"]/div[@class="entry_footer"]/span[@class="gray"]/text()')
                result.append({
                    "news_title": str(title[0]),
                    "news_date": str(push_date[0]),
                    "source_en": spider_config['name_en'],
                    "source_cn": spider_config['name_cn'],
                })
        return result


def main():
    cnblogs = Cnblogs()
    results = cnblogs.get_news()
    print(results)


if __name__ == '__main__':
    main()

总结

通过以上代码,我们实现了采集博客园的功能。

本文章代码只做学习交流使用,作者不负责任何由此引起的法律责任。

各位看官,如对你有帮助欢迎点赞,收藏,转发,关注公众号【Python魔法师】获取更多Python魔法~

qrcode.jpg

标签:__,cnblogs,Python,博客园,news,div,com,class
From: https://www.cnblogs.com/meet/p/18068015

相关文章

  • Python爬取免费IP代理时,无法解析到数据
    大家好,我是Python进阶者。一、前言前几天在Python最强王者交流群【ZXS】问了一个Python网络爬虫实战问题。问题如下:我这里遇到一个问题:【爬取免费IP代理时,无法解析到数据】,我通过xpath,css定位到了元素,但是在运行时返回空列表,请问我该怎么解决呀以下是解析数据的截图:他自......
  • Python控制摄像头并获取数据文件
    一、引言摄像头作为计算机视觉领域的核心设备之一,广泛应用于视频监控、图像采集和数据处理等领域。通过Python编程语言,我们可以实现对摄像头的精确控制,包括摄像头的开启、关闭、参数设置以及数据获取等功能。本文将指导读者完成这些操作,实现摄像头数据的自动化管理。二、摄像......
  • Python数学建模-2.2Python基本数据类型
    各位小伙伴大家好,今天开始学习司守奎老师的《数学建模算法与应用》啦,我也会边学习边与大家分享书中的内容,希望与大家共同进步哦Python中的基本数据类型主要包括以下几种:数字(Numbers)整型(int):正或负整数,没有限制大小。例如:100,-8080,0。浮点型(float):浮点数,即带有小数点的数字。......
  • python安装库文件的时候一个一个安装的py脚本
    在编译安装一些python软件的时候,经常使用pipinstall-rrequirements.txt命令执行。如果其中一个库编译失败,会导致所有的库安装失败,非常费事费力。于是写了一个py小脚本pipinstall.py,将库改为一个一个的安装,这样再碰到编译失败的,也不会影响其它的库,节省时间。文件pipinsta......
  • Windows命令行不加解释器和文件后缀名直接运行Python脚本
    Windows命令行不加解释器和文件后缀名直接运行Python脚本首次编辑:24/2/29/20:30最后编辑:24/2/25/20:44引子都知道Windowscmd中,运行可执行文件和bat时,可以直接输入不带后缀的文件名。rem运行main.exemainrem运行mybat.batmybat而执行python脚本时,却需要指明python作......
  • 利用Python中的ORM操作数据库Mysql(一)
    如何用python操作数据库?很多同学在用python操作数据库的时候会使用pymysql,这确实是一种成熟的方案,但是要写很多sql语句,今天我就来介绍在Django中使用ORM的方法操作数据库。第一章链接数据库首先,安装第三方模块mysqlclient在终端输入:pipinstallmysqlclient启动mys......
  • 部署Python网站项目,测试灰度发布
    部署Python网站项目1安装python依赖软件yum-yinstallgccmakepython3python3-devel2安装项目依赖pip3installpytz-2022.6-py2.py3-none-any.whlpip3安装.whl结尾的包pip3installDjango-1.11.8-py2.py3-none-any.whlpip3installdjango-bootstrap3-11.0.0.tar......
  • python数据分析 datawhale
    数据分析数据载入及初步观察载入数据导入Numpy和pandasimportnumpyasnpimportpandasaspd使用相对路径和绝对路径载入数据df=pd.read_csv('train.csv')df=pd.read_csv('/Users/chenandong/Documents/datawhale数据分析每个人题目设计/招募阶段/第一单元项目集......
  • Python入门学习笔记(1)Python&VS code下载与配置
    去年夏天,笔者拿到EricMatthes所著的蟒蛇书,一番学习下,为其细致与条理所触动。作为曾经学过C++的NOIP退役选手,笔者深知一个好的语言基础对于后续学习的巨大作用。费曼提到,把新知识、复杂概念解释给完全不懂的人听,是最好的提升知识质量、把知识点融入自己的知识体系的方法。因此......
  • Python实战:变量命名规范:编写优雅代码的关键
    在Python编程中,变量命名规范对于编写优雅和可维护的代码至关重要。本文将深入探讨Python中的变量命名规则和最佳实践,包括命名约定、避免命名冲突以及命名中的注意事项。我们将通过具体的代码示例来展示如何遵循命名规范来编写优雅的代码,并理解命名规范在编程中的重要性。1.......