zoukankan      html  css  js  c++  java
  • 爬虫实践---爬取百度贴吧内容

    贴吧地址 :  http://tieba.baidu.com/f?kw=%E7%94%9F%E6%B4%BB%E5%A4%A7%E7%88%86%E7%82%B8&ie=utf-8

    Python版本 : 3.6
    浏览器: Chrome

    一、目标:

    1. 从网上爬下特定页码的网页
    2. 对于爬下的页面内容进行简单的筛选分析
    3. 找到每一篇帖子的 标题、发帖人、发帖时间
    4. 将结果保存到文本。

    二、分析:

    地址中这些都是中文字符,
    %E7%94%9F%E6%B4%BB%E5%A4%A7%E7%88%86%E7%82%B8

    在编码之后就是: 生活大爆炸 。

    链接的末尾处:&ie=utf-8 表示该连接采用的是utf-8编码。

    接着翻到贴吧的第二页:

    url:  http://tieba.baidu.com/f?kw=%E7%94%9F%E6%B4%BB%E5%A4%A7%E7%88%86%E7%82%B8&ie=utf-8&pn=50`

    注意这里,链接的末尾处多了一个参数&pn=50,
    这里很容易就能猜到,这个参数与页码有联系:

    • &pn=0 : 首页
    • &pn=50: 第二页
    • &pn=100:第三页
    • &pn=50*n 第n页
    • 50 表示 每一页都有50篇帖子。

    这下就能通过简单的url修改,达到翻页的效果了。

    三、使用chrome开发人员工具进行页面分析:

    打开控制台,使用模拟点击工具快速定位到一个单独帖子的位置。(左上角的鼠标箭头图标)

    仔细观察一下,发现每个帖子的内容都包裹在一个li标签内:

    <li class=" j_thread_list clearfix">

    这样只要快速找出所有的符合规则的标签,

    在进一步分析里面的内容,最后筛选出数据就可以了。

    四、代码部分

    1.抓取网页的函数

    import requests
    from bs4 import BeautifulSoup
    import time
    
    # 定义抓取页面的函数
    def get_html(url):
        try:
            r = requests.get(url,timeout=30) #第二个参数为超时设置
            r.raise_for_status()             # 如果状态码不是200 则应发HTTOError异常
    
            # 这里事先知道百度贴吧的编码是utf-8,所以手动设置的。爬取其他的页面时建议使用:
            # r.encoding = r.apparent_encoding
            r.encoding = 'utf-8'
            return r.text
        except:
            return "Error"

    2.获取页面内容的函数

    def get_content(url):
        comments = []            #初始化一个列表来保存所有的帖子信息
        html = get_html(url)     #把需要爬取信息的网页下载到本地
    
        soup = BeautifulSoup(html,'lxml')
    
        liTags = soup.find_all('li', class_=' j_thread_list clearfix')
    
        #通过循环找到每个帖子里需要的信息
        for li in liTags:
            comment = {}         #初始化一个字典来存储文章信息
    
            #try:
            comment['title'] = li.find('a', class_='j_th_tit').text.strip()
            comment['name'] = li.find('span', class_='tb_icon_author').text.strip()
            comment['time'] = li.find('span', class_='pull-right is_show_create_time').text.strip()
            comments.append(comment)
            #except:
                #print('Crawed Error!')
    
        return comments

    3.输出到文件的函数

    def OutFile(comments):
        with open('test.txt','a+',encoding='utf-8') as f:
            
            for comment in comments:
    
                f.write('标题:{} 	 发帖人:{} 	 发帖时间:{} 
    '.format(comment['title'],comment['name'],comment['time']))
                
            print('当前页面已爬取完成')

    4.主函数调用

    def main(base_url,deep):
        url_list = []   #将所有待爬取的url存入列表
        for i in range(0,deep):
            url_list.append(base_url + '&pn=' + str(50 * i))
    
        print('所有页面已下载到本地,开始删选信息...')
    
        #循环写入所有的数据
        for url in url_list:
            content = get_content(url)
            OutFile(content)
        print('所有信息都已保存完毕!')
    
    base_url = 'http://tieba.baidu.com/f?kw=%E7%94%9F%E6%B4%BB%E5%A4%A7%E7%88%86%E7%82%B8&ie=utf-8'
    deep = 100 # 设置需要爬取的页面数量
    
    if __name__ == '__main__':
        main(base_url,deep)

    5.爬取结果

  • 相关阅读:
    将自己的工作环境全面移植到C++最后一道工序:能用MFC制作简单的图形界面
    Finally, the working environment has been moved to C++
    统计方面的书籍【zz】
    zz sql 通配符以及转义字符用法
    转载学习并实现DES加密解密算法(三)
    【资源分享】2009版大陆汉语常用字.txt下载
    自己实现的C++Trim()
    nmake命令(windows下的makefile)
    c++对象内存模型【内存布局】
    UML类图关系(VPUML工具绘图)
  • 原文地址:https://www.cnblogs.com/Lovebugs/p/7240137.html
Copyright © 2011-2022 走看看