python 爬取 csdn 个人首页信息以及博客
作者:木偶
- 2022-10-26 陕西
本文字数:2512 字
阅读完需:约 8 分钟
前言:随着 csdn 的更新,许多机制是进行了提升,但是相对于以前而言相信大家还是更喜欢以前的版本吧
一.需要的包:
我们需要使用的有如下的包:
#文件操作
import os
#请求发送
import requests
#网页解析
from lxml import etree
#缓冲时间
import time
复制代码
二.代码部分:
我们对于 csdn 新版本界面进行数据的爬取,新版本个人主页如下图所示:
接下来我们进行书写方法:
def bolg( url , head ):
# 状态码
respone = requests.get(url , headers=head)
print(respone)
复制代码
查看状态码是否正常一般正常的在 200-300 之间,接下来查看网页中元素所在的位置:
我们在页面进行 F12 或者右击鼠标点击检查,然后我们找到我们头像所对应的位置,进行鼠标右击,点击 copy,在二级菜单栏中选择 copy xpath
然后在代码中进行书写规则:
# 解析网页
html = etree.HTML(respone.text)
#头像
img = html.xpath('//div/div[1]/div[2]/div[1]/div[1]/img')
复制代码
然后其他的基本都是一样的操作:
# 解析网页
html = etree.HTML(respone.text)
#原创文章 作者排名 粉丝数量
data = html.xpath('//div/div[1]/div[2]/div[3]/ul/li/a/div')
#被访问量
data1 = html.xpath('//div/div[1]/div[2]/div[3]/ul/li/div')
#头像
img = html.xpath('//div/div[1]/div[2]/div[1]/div[1]/img')
#用户名
username = html.xpath('//div/div[1]/div[2]/div[2]/div[1]/div[1]')
#简介
introduction = html.xpath('//div/div[1]/div[2]/div[2]/div[2]/p')
#文章
content = html.xpath('//div/div[2]/div/div[2]/div/div[2]/div/div/div/article/a')
复制代码
但是有的用户是没有用户名的,那怎么办呢?这时候我们需要来进行判断:
if len(introduction) > 0:
f.write(f'用户简介:{(introduction[0].text).strip()} ')
else:
f.write(f'用户简介:此用户很懒,暂时没有简介 ')
复制代码
三.全部代码:
整体的代码如下,我们会把爬取到的数据写入我们的文件中,文件名就是我们的用户名:
import os
import requests
from lxml import etree
import time
def bolg( url , head ):
# 状态码
respone = requests.get(url , headers=head)
print(respone)
#状态码是否正常
if respone.status_code >= 200 or respone.status_code < 300:
try:
# 开始时间
time1 = time.time()
# 解析网页
html = etree.HTML(respone.text)
#原创文章 作者排名 粉丝数量
data = html.xpath('//div/div[1]/div[2]/div[3]/ul/li/a/div')
#被访问量
data1 = html.xpath('//div/div[1]/div[2]/div[3]/ul/li/div')
#头像
img = html.xpath('//div/div[1]/div[2]/div[1]/div[1]/img')
#用户名
username = html.xpath('//div/div[1]/div[2]/div[2]/div[1]/div[1]')
#简介
introduction = html.xpath('//div/div[1]/div[2]/div[2]/div[2]/p')
#文章
content = html.xpath('//div/div[2]/div/div[2]/div/div[2]/div/div/div/article/a')
with open(f'{username[0].text}.txt', "a",encoding='utf-8') as f:
f.write(f'用户头像:{img[0].attrib["src"]}\n用户名:{username[0].text}\n')
if len(introduction) > 0:
f.write(f'用户简介:{(introduction[0].text).strip()} ')
else:
f.write(f'用户简介:此用户很懒,暂时没有简介 ')
f.write(f'被访问量:{data1[0].text} 原创文章:{data[0].text} 作者排名:{data[2].text} 粉丝数量:{data[4].text}\n')
x = 1
for i in content:
# 文章标题
title = i.xpath('./div[1]/h4')
# 内容简介
center = i.xpath('./div[2]')
# 原创/转载
czzm = i.xpath('./div[3]/div[1]/div[1]')
# 阅读
read = i.xpath('./div[3]/div[1]/div[2]/span')
# 评论
talk = i.xpath('./div[3]/div[1]/div[3]/span')
# 点赞
good = i.xpath('./div[3]/div[1]/div[4]/span')
# 发布时间
date_list = i.xpath('./div[3]/div[2]/span')
with open(f'{username[0].text}.txt', "a", encoding='utf-8') as f:
f.write(f'第: {x} 篇文章标题:{title[0].text}\n')
f.write(f'文章链接:{i.attrib["href"]}\n')
f.write(f'内容简介:{center[0].text}\n')
f.write(f'文章类型:{czzm[0].text} ')
f.write(f'阅读量:{read[0].text} 评论量:{talk[0].text} 点赞量:{good[0].text} {date_list[0].text}{date_list[1].text}{date_list[2].text}\n')
print(f'正在写入第: {x} 篇文章,标题为:{title[0].text} ')
time.sleep(0.5)
x += 1
time.sleep(1)
except Exception as e:
print(f'错误信息:{repr(e.args)}')
finally:
time2 = time.time()
print(f'写入完成,写入:{len(content)}条数据,耗时:{time2-time1}秒')
else:
print('请求异常,请稍候重试!')
if __name__ == '__main__':
# 爬取的链接
url = input('请输入您想要爬取的博主主页链接地址:')
# 请求头
head = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36'
}
bolg(url, head)
复制代码
四.效果图:
因为我们在爬取时候进行了时间的缓冲避免数据太快对服务器影响太大,所以耗时较长
划线
评论
复制
发布于: 刚刚阅读数: 3
版权声明: 本文为 InfoQ 作者【木偶】的原创文章。
原文链接:【http://xie.infoq.cn/article/66442d7dcb9e37d051bcc1f5d】。文章转载请联系作者。
木偶
关注
凭时间赢来的东西,时间肯定会为之作证 2022-10-21 加入
CSDN前端领域优质创作者,CSDN博客专家,擅长PC端以及Uniapp开发
评论