贴吧地址 : 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
一、目标:
- 从网上爬下特定页码的网页
- 对于爬下的页面内容进行简单的筛选分析
- 找到每一篇帖子的 标题、发帖人、发帖时间
- 将结果保存到文本。
二、分析:
地址中这些都是中文字符,
%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.爬取结果