Python爬虫简单实现CSDN博客文章标题列表

操作步骤:

  1. 分析接口,怎么获取数据?
  2. 模拟接口,尝试提取数据
  3. 封装接口函数,实现函数调用。

1.分析接口

打开Chrome浏览器,开启开发者工具(F12快捷键)。

在浏览器中输入CSDN网址 : https://blog.csdn.net ,看``

根据分析,提取到了AJAX调用接口如下:

curl 'https://blog.csdn.net/api/articles?type=new&category=home'   -H 'authority: blog.csdn.net'   -H 'pragma: no-cache'   -H 'cache-control: no-cache'   -H 'accept: application/json, text/javascript, */*; q=0.01'   -H 'dnt: 1'   -H 'x-requested-with: XMLHttpRequest'   -H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36'   -H 'x-tingyun-id: im-pGljNfnc;r=1231324324'   -H 'sec-fetch-site: same-origin'   -H 'sec-fetch-mode: cors'   -H 'sec-fetch-dest: empty'   -H 'referer: https://blog.csdn.net/'   -H 'accept-language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,ja;q=0.6,zh-TW;q=0.5'   -H $'cookie: uuid_tt_dd=10_293732321.........'   --compressed

我们接下来我们开始模拟这个AJAX请求。

"""
说明: 定义了`requests`请求方法`get_resp`用于模拟发送HTTP协议的`GET`请求。
其中可以选择使用代理,如果不是用就甚至`proxies=""`即可。
请求头`headers`需要根据我们分析的请求头选择性填充。
"""
import requests
from lxml import etree
import json ua = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
default_socks = 'socks5://127.0.0.1:1084' def get_resp(url, proxies=default_socks, headers=None, timeout=10):
"""
发送requests请求模块,最多尝试3次
"""
headers = headers
if headers is None:
headers = {'user-agent': ua}
if isinstance(proxies, str):
proxies = {
'http': proxies,
'https': proxies,
}
for _ in range(3):
try:
resp = requests.get(url, proxies=proxies, headers=headers, timeout=timeout)
return resp
except Exception as e:
print(e)
return None

2.模拟接口,尝试提取数据

接下来我们开始模拟接口调用,最终尝试headers需要携带如下面的信息即可请求成功。


headers = {
'authority': 'blog.csdn.net',
'accept': 'application/json, text/javascript, */*; q=0.01',
'referer': 'https://blog.csdn.net/',
'user-agent': ua,
'x-tingyun-id': 'im-pGljNfnc;r=318932708',
'cookie': 'uuid_tt_dd=10_23458360190-1600318910542-823210; dc_session_id=10_1600318910542.883906; dc_sid=182c9fe1bfb457f42ff2bbd06e456f43; TY_SESSION_ID=f594894c-a5ae-49f0-a95f-bf28e848294d; c_first_ref=default; c_first_page=https%3A//blog.csdn.net/; announcement=%257B%2522isLogin%2522%253Afalse%252C%2522announcementUrl%2522%253A%2522https%253A%252F%252Flive.csdn.net%252Froom%252Fyzkskaka%252F5n5O4pRs%253Futm_source%253D1598583200%2522%252C%2522announcementCount%2522%253A0%252C%2522announcementExpire%2522%253A3600000%257D; c-login-auto=1; Hm_lvt_6bcd52f51e9b3dce32bec4a3997715ac=1600318916; Hm_lpvt_6bcd52f51e9b3dce32bec4a3997715ac=1600318916; Hm_up_6bcd52f51e9b3dce32bec4a3997715ac=%7B%22islogin%22%3A%7B%22value%22%3A%220%22%2C%22scope%22%3A1%7D%2C%22isonline%22%3A%7B%22value%22%3A%220%22%2C%22scope%22%3A1%7D%2C%22isvip%22%3A%7B%22value%22%3A%220%22%2C%22scope%22%3A1%7D%7D; Hm_ct_6bcd52f51e9b3dce32bec4a3997715ac=6525*1*10_23458360190-1600318910542-823210; dc_tos=qgsdzo',
}
url = 'https://blog.csdn.net/api/articles?type=more&category=python&shown_offset=1600319325563840' resp = get_resp(url, headers=headers)
print(resp.status_code, url)
jdata = resp.json()

执行结果:

200 https://blog.csdn.net/api/articles?type=more&category=python&shown_offset=1600319325563840
articles = jdata['articles']
offset = jdata['shown_offset']
title_list = [i['title'] for i in articles]
print('offset:', offset)
print('title_list:', title_list)

执行结果:

offset: 0
title_list: ['Windows 环境下 PyCharm 配置 PyQt5 图形化 QT Designer', 'Python将网页转化为PDF(python网页自动长截图)', 'LeetCode 126. 单词接龙 II python', 'python爬虫之爬取多篇含有关键词的文章标题和内容优化', 'Python利用Groupby机制绘制柱状图时KeyError和TypeError问题及解决方法', '算法练习-KNN分类预测', 'win10 python3 安装 Tensorflow-gpu 问题及解决', 'Python爬取高质量电脑壁纸,还是很好看的', 'Tutorial教程:mxnet模型转换为tensorflow 2.0/keras 模型-全网唯一', 'pytorch线性回归代码实现 测试,保存,加载模型 有详细注释']

上面已经模拟成功接口调用,接下来我们实现函数化

3. 接口封装函数化

接口模拟调用成功后,我们开始将变量参数提取出来,作为函数的参数,实现函数化。

我们简单封装了提取页数参数的fetch_page函数,使用如下

fetch_page(5)

这样我们可以根据调度频率来决定每次提取的页面数量。


def fetch_page(pn=10):
headers = {
'authority': 'blog.csdn.net',
'accept': 'application/json, text/javascript, */*; q=0.01',
'referer': 'https://blog.csdn.net/',
'user-agent': ua,
'x-tingyun-id': 'im-pGljNfnc;r=318932708',
'cookie': 'uuid_tt_dd=10_23458360190-1600318910542-823210; dc_session_id=10_1600318910542.883906; dc_sid=182c9fe1bfb457f42ff2bbd06e456f43; TY_SESSION_ID=f594894c-a5ae-49f0-a95f-bf28e848294d; c_first_ref=default; c_first_page=https%3A//blog.csdn.net/; announcement=%257B%2522isLogin%2522%253Afalse%252C%2522announcementUrl%2522%253A%2522https%253A%252F%252Flive.csdn.net%252Froom%252Fyzkskaka%252F5n5O4pRs%253Futm_source%253D1598583200%2522%252C%2522announcementCount%2522%253A0%252C%2522announcementExpire%2522%253A3600000%257D; c-login-auto=1; Hm_lvt_6bcd52f51e9b3dce32bec4a3997715ac=1600318916; Hm_lpvt_6bcd52f51e9b3dce32bec4a3997715ac=1600318916; Hm_up_6bcd52f51e9b3dce32bec4a3997715ac=%7B%22islogin%22%3A%7B%22value%22%3A%220%22%2C%22scope%22%3A1%7D%2C%22isonline%22%3A%7B%22value%22%3A%220%22%2C%22scope%22%3A1%7D%2C%22isvip%22%3A%7B%22value%22%3A%220%22%2C%22scope%22%3A1%7D%7D; Hm_ct_6bcd52f51e9b3dce32bec4a3997715ac=6525*1*10_23458360190-1600318910542-823210; dc_tos=qgsdzo',
}
offset='1600319325563840'
for _ in range(pn):
url = f'https://blog.csdn.net/api/articles?type=more&category=python&shown_offset={offset}'
resp = get_resp(url, headers=headers)
print(resp.status_code, url)
jdata = resp.json()
articles = jdata['articles']
offset = jdata['shown_offset']
for i in articles:
print(i['title'])
fetch_page(3)

执行结果:

SOCKSHTTPSConnectionPool(host='blog.csdn.net', port=443): Read timed out. (read timeout=10)
200 https://blog.csdn.net/api/articles?type=more&category=python&shown_offset=1600319325563840
[PyQt5]python点击按钮实现窗口切换
Anaconda 如何切换Python版本 + Pycharm的设置
【PPD12】直方图
kotlin中join方法效果验证
9.16任务:条件语句,循环语句,range函数,enumerate函数,推导式
python金融正太var方差-协方差代码
python爬取阳光问政
openpyxl模块基本用法
Python:__init__()方法
Pandas用法详细介绍
200 https://blog.csdn.net/api/articles?type=more&category=python&shown_offset=0
语义分割制作自己的voc数据集
Python继承小案例
Pycharm如何创建项目
两个链表的第一个公共节点---遍历彼此的节点
LeetCode刷题(163)~每日温度【单调栈】
Python-纯字母字符串内存地址一样,否则不一样,如下案例
OpenCV笔记02
Python编程:从入门到实践第六章读书笔记6.2使用字典
TensorFlow 19——ch14-词的向量表示:word2vec与词嵌入
笔记_005_布尔值_比较运算符_逻辑运算符_同一运算符
200 https://blog.csdn.net/api/articles?type=more&category=python&shown_offset=0
Selenium安装与基本使用
【剑指offer】#05替换空格 - 正则 - 数组 - 双指针
Python中‘r‘,‘r+‘,‘w‘,‘w+‘,‘a‘,‘a+‘区别总结
2020CISCN初赛-crypto-lfsr writeup
读取txt文件后修改特定内容并保存
Pycharm中文指南
python切片操作的注意事项
2020-09-16
LeetCode226:翻转二叉树
练习:二元逻辑回归实现

总结

这里使用的时requests库模拟发送GET请求,其中的cookies信息是手工填写的,当然也可以稍微复杂一点的实现自动获取,这里只是介绍基础提取方法。

向了解更多知识可以访问 虫师de江湖 全面了解更多关于爬虫知识。


Python爬虫简单实现CSDN博客文章标题列表的更多相关文章

  1. JAVA爬虫挖取CSDN博客文章

    开门见山,看看这个教程的主要任务,就去csdn博客,挖取技术文章,我以<第一行代码–安卓>的作者为例,将他在csdn发表的额博客信息都挖取出来.因为郭神是我在大学期间比较崇拜的对象之一.他 ...

  2. python 爬虫 爬取序列博客文章列表

    python中写个爬虫真是太简单了 import urllib.request from pyquery import PyQuery as PQ # 根据URL获取内容并解码为UTF-8 def g ...

  3. Python爬虫抓取csdn博客

    昨天晚上为了下载保存某位csdn大牛的所有博文,写了一个爬虫来自己主动抓取文章并保存到txt文本,当然也能够 保存到html网页中. 这样就能够不用Ctrl+C 和Ctrl+V了,很方便.抓取别的站点 ...

  4. 利用爬虫爬取指定用户的CSDN博客文章转为md格式,目的是完成博客迁移博文到Hexo等静态博客

    文章目录 功能 爬取的方式: 设置生成的md文件命名规则: 设置md文件的头部信息 是否显示csdn中的锚点"文章目录"字样,以及下面具体的锚点 默认false(因为csdn中是集 ...

  5. python环境变量配置 - CSDN博客

    一.下载: 1.官网下载python3.0系列(https://www.python.org/) 2.下载后图标为: 二.安装: Window下: 1.安装路径: 默认安装路径:C:\python35 ...

  6. Python爬取CSDN博客文章

    0 url :http://blog.csdn.net/youyou1543724847/article/details/52818339Redis一点基础的东西目录 1.基础底层数据结构 2.win ...

  7. CSDN博客文章的备份及导出电子书CHM

    需要用到的工具集合下载:http://download.csdn.net/source/2881423 在CSDN.百度等写博客文章的应该很多,很多时候担心服务器有一天突然挂了,或者担心自己的号被封了 ...

  8. Hello Python!用 Python 写一个抓取 CSDN 博客文章的简单爬虫

    网络上一提到 Python,总会有一些不知道是黑还是粉的人大喊着:Python 是世界上最好的语言.最近利用业余时间体验了下 Python 语言,并写了个爬虫爬取我 csdn 上关注的几个大神的博客, ...

  9. 使用word写CSDN博客文章

    目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...

随机推荐

  1. P2034 选择数字 / P2627 [USACO11OPEN]Mowing the Lawn G

    Link 题目描述 给定一行 \(n\) 个非负整数 \(a[1]..a[n]\) .现在你可以选择其中若干个数,但不能有超过 \(k\) 个连续的数字被选择.你的任务是使得选出的数字的和最大. 输入 ...

  2. ubuntu20 使用命令安装 nginx

    安装 nginx sudo apt-get install nginx -y 配置文件 nginx 服务管理 # 启动 nginx 服务 service nginx start # 关闭 nginx ...

  3. 【idea&spring mvc】搭建简易的spring mvc项目(基于maven)!

    一.创建项目 1.打开idea,file--new--project 2.按照步骤①②③④操作 3.输入包名,并点击下一步 4.选择下载包的maven的setting.xml配置路径和包的存放地,然后 ...

  4. 微信小程序tabbar不显示2019.04.06

    app.json中pages的第一项必须在tabBar中,且这一项需要在pages的list中(与顺序无关)否则无法显示tabBar app.json中pages数组中第一项(首页),必须在tabBa ...

  5. 基于python实现链式栈

    """ 链式栈 linkstack.py 思路分析: 1.源于链表结构 2.封装栈的操作方法(入栈,出栈,栈空,栈顶) 3.链表的开头作为栈顶(不用每次遍历,效率高,怎样 ...

  6. 面试一个百度T7程序员,一道简单的题没答上来!网友却都在吐槽面试官!

    程序员面试时都考些什么? 一个面试官得意洋洋地说自己面了一个百度T7,出了一道coding题,结果对方连最长上升子序列都写不出来.   楼主本想嘲弄一下百度T7的代码水平低,没想到网友们炸开了锅,纷纷 ...

  7. Vagrant系列(一)----win10搭建Vagrant+VirtualBox环境_

      一.Vagrant是什么?     vagrant是一个操作虚拟机的工具.是一个基于Ruby的工具,用于创建和部署虚拟化开发环境.    通过命令和配置文件来管理虚拟机,很快就能完成一套开发环境的 ...

  8. appium_android-常见的问题

    po模型的原则: 用公共方法代表UI所提供的功能 方法应该返回其他的PageObject或者返回用于断言的数据 同样的行为不同的结果可以建模为不同的方法 不要在方法内加断言 字段意义 不要暴露页面内部 ...

  9. linux磁盘空间满的处理

    Java中运行SQL插入数据时报错: linux磁盘空间满处理: 1.df -h  查看磁盘空间占用,实际上是查看磁盘块占用的文件(block) 2.分别查看输入以下命令 (面对磁盘满了,通过下列命令 ...

  10. document.all.WebBrowser为空或不是对象

    项目中也想用这个功能,发现出错,经过测试,一定要加<object id="WebBrowser" width=0 height=0 classid="CLSID:8 ...