动态爬取博客信息
- 前言
- 网页分析
- 功能实现
-
- 准备工作
- 获取网页
- 输出结果
- 程序封包
-
- 注意
- 程序源码
- 总结
前言
大三上刚接触python,在最后的学期实训中老师想让我们在博客园上写一篇有关于爬虫的博客(说是方便爬取每篇博客的信息),但是个人属实不喜欢博客园的界面,于是在CSDN上编写了博客然后爬取自己博客的信息。
网页分析
以我之前写的实训博客为例,首先我们在网页上F12通过观察网页,博客名称、浏览量、点赞数、评论数、收藏数都可以很方便的找到对应标签,于是乎我就先用静态的方法爬取。
import requests
import re
url='https://blog.csdn.net/qq_45279235/article/details/111696618'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'}
html=requests.get(url,headers=headers)
#点赞数量
spancount=re.findall(r'<span id="spanCount" class="count" style>(.*?)</span>',html.text)
print(spancount)
但是静态爬取点赞数量和收藏数量出来的结果是空值(只展示了一部分代码),并且评论的标签爬出来的结果并不唯一。

所以我就把静态爬取网页的请求结果text输出出来,结果没有找到对应的标签和数据,只好就改成动态爬取。
功能实现
准备工作
1.安装Selenium库。
如果网速过慢安装失败的话使用镜像源下载
pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple
如果提示WARNING: You are using pip version 20.2.1; however, version X.X.X is available 使用镜像源更新pip
python -m pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple
2.下载对应的webdriver驱动
浏览器设置里面可以找到你的版本
在这里找到对应的驱动器,下载之后放到python的文件夹中
获取网页
通过驱动打开目标博客的网页
import requests
import re
from selenium import webdriver
browser = webdriver.Chrome(r'E:\python\Scripts\chromedriver.exe')
browser.get(url)
在寻找对应标签(展示一部分)
通过方法获取对应标签然后text把数据给输出来
find_element_by_id
find_element_by_name
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector
因为静态爬取评论时得到的结果不唯一,所以这里的评论的爬取我选择通过xpath得到,后面在自己试验中通过class标签获得的评论标签也是可以的。
title = browser.find_element_by_class_name('title-article')
# print(title.text)
time = browser.find_element_by_class_name('time')
# print(time.text)
read_count = browser.find_element_by_class_name('read-count')
# print(read_count.text)
collection = browser.find_element_by_class_name('get-collection')
# print(collection.text)
like = browser.find_element_by_id('spanCount')
# print(like.text)
comment = browser.find_element_by_xpath('//*[@id="toolBarBox"]/div/ul/li[2]/a/span[2]')
输出结果
如果直接把获取标签结果输出去是 WebElement 类型,通过getAttribute()方法获得的是标签的属性值,所以不能使用,一开始也让我思考了半天。这里我们要标签里面的值就直接like.text输出就好了,输出之后把网页关闭。
print('博客名称:'+title.text)
print('发布时间:'+time.text)
print('浏览量:'+read_count.text)
print('收藏:'+collection.text)
print('点赞:'+like.text)
print('评论:'+comment.text)
browser.close()
程序封包
下载PyInstaller库
pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple
使用pyinstaller把.py文件封包
pyinstaller -F F:\python\1-5.py --distpath=F:\python\
-F是表示产生一个文件用于部署
F:\python\1-5.py是要封包的文件
–distpath=F:\python\是产生exe文件的位置
注意
在封包过后使用exe文件时会提醒我这样的一行代码
在询问老师后,老师也是查阅了很长时间之后给出了一个很有效的解决办法,再次调试程序后封包exe文件使用就不会提示错误了
更多有关PyInstaller使用方法可以参考: 链接
程序源码
# -*- coding:utf-8 -*-
import requests
import re
from selenium import webdriver
def obtain(url):
browser = webdriver.Chrome(executable_path=r'E:\python\Scripts\chromedriver.exe')
browser.get(url)
# 窗口最小化
# browser.minimize_window()
title=browser.find_element_by_class_name('title-article')
time = browser.find_element_by_class_name('time')
# print(time.text)
read_count = browser.find_element_by_class_name('read-count')
# print(read_count.text)
collection = browser.find_element_by_class_name('get-collection')
# print(collection.text)
like=browser.find_element_by_id('spanCount')
# print(like.text)
comment = browser.find_element_by_xpath('//*[@id="toolBarBox"]/div/ul/li[2]/a/span[2]')
# print(comment.text)
print('博客名称:'+title.text)
print('发布时间:'+time.text)
print('浏览量:'+read_count.text)
print('收藏:'+collection.text)
print('点赞:'+like.text)
print('评论:'+comment.text)
browser.close()
# pyinstaller -F F:\python\1-5.py --distpath=F:\python\
if __name__ == '__main__':
i=1
while i == 1:
print('输入你的选择:')
print('1.获取博客信息')
print('2.退出')
s=int(input())
if s == 1:
x=input('请输入你想要获取的博客链接:')
obtain(x)
elif s == 2:
i=-1
else :
print('请重新输入选择:')
s=int(input())
总结
静态爬取和动态爬取是根据网页的信息存在与否决定使用哪种,当然像之前提到的静态小说网页也可以使用动态爬取,但是动态网页就不能使用静态爬取网页的方法了。爬取的思路是自己慢慢琢磨出来的,可能存在不好的地方,请各位大佬在评论中指出,让程序更加完善。