爬虫实践---爬取百度贴吧内容

贴吧地址 :  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.爬取结果

原文地址:https://www.cnblogs.com/Lovebugs/p/7240137.html