小结:
爬取网页很简单,只需要对爬虫头部进行伪装,然后对服务器发送请求即可。在此程序中通过构造函数getHTML来实现.而页面分析相对而言比较麻烦.
通过查看页面代码发现该页面所有问题或文章的标题都是<h4>标签.
所以我们直接查找h4标签即可,而链接是存放在<a>标签中的href属性中,然而直接搜索却会发现出现很多其他的链接,例如开通vip啊之类的......发现该页面的所有链接都存放在<a>标签中,但是我们只需要最近的文章或问题对应的链接,通过查看页面代码发现“最近”栏框的所有相关标签都在属性为mainContent的div标签中作为子标签存在.
所以我们先查找mainContent
接着再去找他的子标签中的a标签然后获取href属性即可.
然而,需要注意的是,假设你最近回答了别人的问题,而且在回答里放了链接.
然后按照刚才的方法去查找链接,就会出现链接比标题多的情况.原因是你的回答里的那个链接会被放在回答的那个标签里最为子标签a的属性出现,而不是在正文里.
这时可通过正则表达式洗出该链接.因为所有与csdn相关的链接内包含csdn,所以只需找csdn即可.
当然,这个方法有一个bug,例如在回答中放入一个csdn的相关链接,这样就并不能洗去这个链接.因为博主比较菜,关于爬虫的知识还在学习中,所以还没有找到更好的方法,如果大家有更好的方法,请务必评论.
代码:
import requests
from bs4 import BeautifulSoup
import re
def getHTML(url):
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36 Edg/98.0.1108.56"
}
try:
r=requests.get(url,headers=headers)
r.raise_for_status()
#print(r.request.headers)
r.encoding =r.apparent_encoding
return r.text
except:
return "产生异常."
def gettitele(str1):
# title = str1.find_all("h4")
detials = str1.select('h4')[0].text
title_len = len(str1.select('h4'))#获取标题长度
#print(title_len)
#print(str1.select('h4')[19].text)
#print(detials)
title= {}
for i in range(0, title_len):
title[i]=str1.select('h4')[i].text
return title
def geturl(str1):
url= str1.select(".mainContent")#找最近框
url=str(url)
url=BeautifulSoup(url, 'html.parser')
#ans=url.find_all("href")
#url=url.select("a")
num = 0
for i in range(len(url.select("a"))):#遍历所有a标签
# print(url.select("a")[i])
str2=str(url.select("a")[i])#找a标签
str2 = BeautifulSoup(str2, 'html.parser')
str2 = str2.find("a")
str2=str2.get("href") #获取链接属性
str2=str(str2)
#pattern = re.compile(str2)
#print(pattern)
ans=re.findall(r".*csdn.*",str2)
# print(ans)
if (len(ans)!=0):
num+=1
print(ans,num)
url="https://blog.csdn.net/kilig_CSM?type=blog"
html=getHTML(url)
#print(getHTML(url))
str1 = BeautifulSoup(html, 'html.parser')
title=gettitele(str1)
num=0
for i in range(len(title)):
num += 1
print(title[i],num)
geturl(str1)
#print(title)