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. Allegro PCB 转 PADS Layout 之后的修修补补

    操作系统:Windows 10 x64 工具:PADS Layout VX.2.3 参考:Allegro转PADS以及后续修改 我们可以看到转换后的PCB文件,乱糟糟的,所以还需要我们手动修改一下. ...

  2. Activity的常用控件

    TimerPick(时间控件)public Integer getCurrentHour() //返回当前设置的小时public Integer getCurrentMinute()//返回当前设置的 ...

  3. Jmeter5.3源码编译

    下载源码 https://jmeter.apache.org/download_jmeter.cgi 配置网络环境(重要) 下载 Proxifier 配置上网条件 导入Idea 通过 Idea 的 O ...

  4. MQTT消息队列压力测试

    环境准备: jmeter插件下载:mqttxmeter1.0.1jarwithdependencies.jar 把MQTT插件放在 %JMeter_Home%/lib/ext下.重启jmeter. M ...

  5. PropertySheet外壳扩展AppWizard

    下载source files - 39 Kb 下载Wizard - 17 Kb 本文旨在简化属性表外壳扩展的实现.它紧接我的第一篇文章 处理上下文菜单壳扩展和灵感 由Michael Dunn最优秀的系 ...

  6. golang常用库:配置文件解析库-viper使用

    一.viper简介 viper 配置解析库,是由大神 Steve Francia 开发,他在google领导着 golang 的产品开发,他也是 gohugo.io 的创始人之一,命令行解析库 cob ...

  7. linux的安装3.7python

    centos安装python3 首先安装依赖包 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-dev ...

  8. CSS的元素显示模式与转换

    CSS的元素显示模式与转换 1. CSS的元素显示模式 1.1 块元素 <div>标签是最典型的块元素.另外常见的块元素有h1~h6.p.ul.ol.li等. 特点: 独占一行 高度.宽度 ...

  9. 盐城5138.6118(薇)xiaojie:盐城哪里有xiaomei

    盐城哪里有小姐服务大保健[微信:5138.6118倩儿小妹[盐城叫小姐服务√o服务微信:5138.6118倩儿小妹[盐城叫小姐服务][十微信:5138.6118倩儿小妹][盐城叫小姐包夜服务][十微信 ...

  10. SpringBoot+MongoDB实现物流订单系统

    码字不易,点赞收藏,养成习惯!原创作者公众号:bigsai.更多精彩期待与您分享!项目收录在github的MongoDB案例中,文章收录在回车课堂中如果没基础请看看前两篇(墙裂推荐)MongoDB从立 ...