一、前言

本文为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

三、数据分析

首先来看看泡在贴吧里的年级分布

可以看到虽然即将高考,但是贴吧里依旧是高三党占据了一大半,不过等等,怎么高考吧还混进几位初中生。再来看看文理科分布

总体来说,还是理科生更多一点,接着看大家最喜欢在贴吧讨论哪些学科

可以看到,最常常被提起的学科是数学,除了语数外讨论最多的是物理化学,难道是因为这些学科难?再来看看高三党们最想考的学校前十名

果然基本上想考的学校和大学实力成正比,不过光在贴吧发帖可不够哦,最后看下高考吧的词云图


©著作权归作者所有:来自51CTO博客作者mb5fe18e32e4691的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. php获取文件夹中文件的两种方法
  2. PHP如何将中文转英文
  3. php如何使用PHPAnalysis提取关键字中文分词
  4. 带你解决PHP界面显示中文乱码的问题
  5. php-fpm.conf配置文件中文及重要参数说明
  6. 分析php生成短网址/短链接原理和用法实例
  7. 关于PHP正则匹配中文
  8. 中文分词 PHP 扩展 SCWS 安装方法
  9. PHP生成中文验证码并检测对错实例

随机推荐

  1. 更改android锁屏方向
  2. android入门1:有关布局与activity数据传递
  3. Qt For Android(安卓)设置
  4. Android中WebView页面交互
  5. cocos2d-x编译到android平台后,增加返回键
  6. 导入Android自带Sample工程出错解决(Erro
  7. No resource found that matches the giv
  8. 系出名门Android(5) - 控件(View)之TextV
  9. android studio 2.1 preview4 之 gradle
  10. Android入门(3) 搭建开发环境