一、前言
本文为python爬虫+可视化系列第五篇,前几篇请猛戳文末链接~希望能通过详解一些简单的小项目来学习python。今天要做的是爬取百度贴吧高考吧的帖子来看看即将高考的同学们。
首先来看看怎样从网站中拿到我们要的帖子标题信息,因为后面要循环去爬每一页所以我们写一个函数来爬,这里不用request也不用bs4等模块,我们使用之前文章讲过的mechanicalsoup去爬,来看代码
def get_title(full_url,result): browser = mechanicalsoup.StatefulBrowser()
browser.open(full_url)
res = browser.get_current_page()
tem = res.find_all('a')
for tem1 in tem:
tem2 = str(tem1.get('href'))
title = str(tem1.get('title'))
if len(tem2) == 13:
result.append(title)
return result
那么这个函数接收两个参数,一个是目标url,而result是一个空list用来存储标题,第一行用来创建一个浏览器实例,第二行是打开目标网站,第三行获取网页内容,第四到九行用来提取标题信息并存储到list中,最后将结果返回。
接下来因为我们需要爬高考吧前100页的帖子,所以我们先来看看每一页对应的链接有什么规律
看到这里,该如何生成每一页的链接我想就不用多说了,看代码
def patieba(url, beginPage, endPage,result):
for page in range(beginPage, endPage + 1):
pn = (page - 1) * 50
full_url = url + "&pn=" + str(pn)
get_title(full_url,result)
最后附上完整代码(如果要爬更多页数注意请求频率和代理ip的设置哦)
import mechanicalsoup
def get_title(full_url,result):
print(full_url)
browser = mechanicalsoup.StatefulBrowser()
browser.open(full_url)
res = browser.get_current_page()
tem = res.find_all('a')
for tem1 in tem:
tem2 = str(tem1.get('href'))
title = str(tem1.get('title'))
if len(tem2) == 13:
result.append(title)
return result
def patieba(url, beginPage, endPage,result):
for page in range(beginPage, endPage + 1):
pn = (page - 1) * 50
full_url = url + "&pn=" + str(pn)
get_title(full_url,result)
if __name__ == '__main__':
result = []
beginPage = 1
endPage = 10
full_url = 'http://tieba.baidu.com/f?kw=高考'
patieba(full_url, beginPage, endPage,result)
需要注意一点的是,在我们将高考吧的链接复制到编辑器中是不显示中文的,也就是我们看到浏览器中的链接是
http://tieba.baidu.com/f?kw=高考
但是实际上粘贴就成了
https://tieba.baidu.com/f?kw=%E9%AB%98%E8%80%83
这是因为浏览器对中文请求参数进行了转码,用代码访问网站所发的请求中如果有中文也必须是转码之后的。但因为我们使用的mechanicalsoup会对请求自动地进行urlencode,所以可以直接使用带中文的链接,如果是使用urllib去爬的话就需要进行下面一步转码
import urllib.parse
kw_url = "http://tieba.baidu.com/f?"
kw_key = urllib.parse.urlencode({"kw": kw})
full_url = kw_url + kw_key
首先来看看泡在贴吧里的年级分布
可以看到虽然即将高考,但是贴吧里依旧是高三党占据了一大半,不过等等,怎么高考吧还混进几位初中生。再来看看文理科分布
总体来说,还是理科生更多一点,接着看大家最喜欢在贴吧讨论哪些学科
可以看到,最常常被提起的学科是数学,除了语数外讨论最多的是物理化学,难道是因为这些学科难?再来看看高三党们最想考的学校前十名
果然基本上想考的学校和大学实力成正比,不过光在贴吧发帖可不够哦,最后看下高考吧的词云图