在这学期学习了java web的基础上,又学习了Python的基本语法,所以尝试着做了一个简单版的爬虫,爬取了我所有博客的阅读数。进阶版:https://blog.csdn.net/Q_M_X_D_D_/article/details/94732292
编程思路
实现这个简单的爬虫大致分三步:
1、先使用Python的第三方库requests来将整个页面下载下来,这时页面内的所有内容就会被我们读取出来了,当然也包括每篇文章的阅读数。
2、使用第三方库re中的正则表达式来将页面中我们所需要的信息筛选出来。即把阅读数标签附近的代码抽取出来。在浏览器中右键点击审查元素即可查看网页源代码。将鼠标移到HTML代码上可以显示出这行代码的作用范围。例如:
由此看到,每篇博客的阅读数被包含在一个<span>标签里,这时就可以使用正则表达式将这个span标签的内容全部选取出来。
3、第二步可以将span标签中的所有内容选取出来,但是这时里面还有其他我们不需要的信息,我们只需要标签里阅读数这个数字,所以就再使用一次正则表达式将span标签中的阅读数选取出来。
实现过程
下载页面
首先分析我们要爬取的页面,在我的博客首页中可以看出,我的所有博客被分到了7个页面中,而每个页面有20片博客:
而这7个页面的网址非常相似:
由此看出,每一页的网址就是“https://blog.csdn.net/Q_M_X_D_D_/article/list/”后面加上页数和一个问号。那么我们就将“https://blog.csdn.net/Q_M_X_D_D_/article/list/”当做基址,通过向后拼接字符串来得到每个页面的地址,然后下载每个页面。代码如下:
list=[]
def link_crwael(start_url):
html=download(start_url)
temp=get_num(get_span(html))
for i in temp:
if(int(i)>5):
list.append(int(i))
def download(url):
print(f"try to download url={url}")
resp=requests.get(url)
if resp.status_code==200:
return resp.text
url="https://blog.csdn.net/Q_M_X_D_D_/article/list/"
for i in range(1,8):
link_crwael(url+str(i)+"?")
print(list)
list.clear()
首先是用download函数下载一个页面的所有内容,并将HTML代码送到link_crwael函数中。link_crwael函数用来将接收到的HTML代码进行筛选,将阅读数抽出存到一个list中,其中的get_span和get_num函数下面再讲。每页的所有文章阅读数输出到一行中,然后将list清空,方便输出下一页的阅读数。
爬取span标签
下载好页面之后就该用正则表达式将span标签选取出来,在审查元素中,我首先将阅读数对应位置的span标签的内容先复制下来,是这样的:
<span class="read-num">阅读数 <span class="num">79</span> </span>
然后提取特征,编写正则表达式:
r"<span class=\"num\">[0-9]*</span>"
然后用这个正则表达式对所有HTML代码进行查询,返回所有符合正则表达式的内容,放到一个列表中,列表中存的是字符串。代码如下:
def get_span(html):
# 将正则表达式编译之后可以使用findall函数 #
web_regex=re.compile(r"<span class=\"num\">[0-9]*</span>")
return web_regex.findall(html)
提取阅读数
此时我们已经得到了所有符合条件的span标签,例如:
<span class="read-num">阅读数 <span class="num">79</span> </span>
此时我们就该将这些字符串中的数字提取出来,再次编写一个提取数字的正则表达式:
r"[0-9]+"
对列表中每个字符串进行提取,然后就得到了每篇博客的阅读数啦。代码如下:
def get_num(list):
num_regex=re.compile(r"[0-9]+")
s=""
for i in list:
s+=str(i)
return num_regex.findall(s)
运行结果
源代码
import re
import requests
def get_span(html):
# 将正则表达式编译之后可以使用findall函数 #
web_regex=re.compile(r"<span class=\"num\">[0-9]*</span>")
return web_regex.findall(html)
def get_num(list):
num_regex=re.compile(r"[0-9]+")
s=""
for i in list:
s+=str(i)
return num_regex.findall(s)
list=[]
def link_crwael(start_url):
html=download(start_url)
temp=get_num(get_span(html))
for i in temp:
if(int(i)>5):
list.append(int(i))
def download(url):
print(f"try to download url={url}")
resp=requests.get(url)
if resp.status_code==200:
return resp.text
url="https://blog.csdn.net/Q_M_X_D_D_/article/list/"
for i in range(1,8):
link_crwael(url+str(i)+"?")
print(list)
list.clear()