摘要:利用requests和BeautifulSoup,爬取网页的源代码,从而抓取到有用的字符信息后进行筛选与匹配。
注:csdn提供有搜索栏,可以通过url链接直接进行搜索,搜索结果的界面是动态网页和静态网页结合的。(具体我也不知道为什么,但是确实搜索结果一部分在源代码里有,一部分没有)简单起见,我们只爬取静态的部分,这样我们只需解析源代码就好了。
先上代码:
#通过关键词爬取csdn博客文章
import requests
from bs4 import BeautifulSoup
def getHTMLText(url): #作用:得到html的text
try:
r= requests.get(url,timeout =30)
r.raise_for_status
r.encoding= "utf-8"
return r.text
except:
# print ("getHTMLText出现异常")
return "getHTMLText出现异常"
def getInformation(soup): #作用:将html的有用信息筛选出来并储存到相对应的列表alist中
#通过查看网页源代码,分析得到下面的解析特点。
data =soup.find_all("dl") #每个dl里面储存着一篇csdn博客的信息,1个dl里有1个dt和3个dd
for dl in data:
ldt=dl.find_all("dt") #dt里储存着博客的题目
for dt in ldt:
# print (type(dt.get_text()))
text=dt.get_text()
# print (text)
indexOfStart=text.find("\n")
indexOfEnd=text.find("- CSDN博客")
# print (indexOfStart)
# print (indexOfEnd)
title=text[indexOfStart:indexOfEnd-3].replace("\n","")
print ("标题是:"+title)
# print ("@@@@@@@@@@@@@@@@@@@@@@@@@@@")
ldd =dl.find_all("dd") #1个dl里有3个dd,分别是作者日期浏览次数,简介,链接
#作者日期浏览次数
text = ldd[0].get_text()
indexOfStart = text.find("作者")
indexOfEnd = text.find("日期")
author = text[indexOfStart+3:indexOfEnd - 3]
print ("作者是:" + author)
indexOfStart = text.find("日期")
indexOfEnd = text.find("浏览")
date = text[indexOfStart + 3:indexOfEnd - 3]
print ("日期是:" +date)
text = ldd[0].get_text()
indexOfStart = text.find("浏览")
indexOfEnd = text.find("次")
clickTimes = text[indexOfStart + 3:indexOfEnd - 1]
print ("浏览次数是:" + clickTimes)
#简介
text = ldd[1].get_text()
text=text.replace("\n","")
print ("简介是:" + text)
#链接
text = ldd[2].get_text()
print ("链接是:" + text)
print ("**********************************************************")
def main():
a=["线程","地址"]
# keyword="进程"
keyword=""
for i in range(len(a)-1):
keyword=keyword+a[i]+"+"
keyword = keyword + a[-1]
# print (keyword)
html = getHTMLText(r"https://so.csdn.net/so/search/s.do?q="+keyword+"&t=blog&o=&s=&l=")
soup = BeautifulSoup(html, "html.parser")
getInformation(soup)
main()
图文解释:下图就是搜索界面,可以看出可以通过url链接直接定位到相关的搜索界面。
右键查看源代码,会发现一个比较特别的地方。常规的网页不是动态就是静态,前者从数据库服务器接收信息,后者源代码里则会有具体信息。但csdn的搜索界面的源代码是部分动态部分静态的。经过分析发现,也是有一定规律的。
如上图,这两篇博客的信息构架是不同的。上面只有标题、简介和链接,而下面的则多了作者、日期、浏览次数三个信息。然后在源代码里搜索上面的博客,搜不到,说明源代码里没有这篇博客的信息。但下面的博客是在源代码里是搜的到的。
我猜想原因应该是csdn在建设过程中有些改动,导致数据的不一致。简单起见我们只爬取静态的博客,即利用源代码的解析,提供我们需要的字符内容就行了。具体操作因网页而已,代码中有介绍,不再赘述。
最后是关键词的问题,单个关键词必较容易,多个关键词,csdn是采用的+连接,所以这时要注意输入的方式。
评价:
爬取效果:对于静态的博客爬取内容比较全面,便于观看浏览。
时间:速度较快,一秒之内就可以。因为不需要渲染,只需解析源代码即可。