1.爬虫需求
爬取 具体贴吧 作者、内容、发帖时间、回复数量,, 百度贴吧有 反爬虫机制 所有可能会出现 出现验证码的情况,只需要过一会 再试即可, 这里只为 练习使用 BeautifulSoup 没有去破解验证码。
2.实现效果
每一页写入一个 txt 文件
3.代码实现
代码相对来说 比较容易理解,看注释即可理解
# 百度贴吧,没有解决访问过多后,被安全限制
import time
import requests
from bs4 import BeautifulSoup
url = 'http://tieba.baidu.com/f?ie=utf-8&kw=%E9%A2%86%E5%85%8B03'
base_url = 'http://tieba.baidu.com'
pn = 0
def get_html(url):
html = requests.get(url)
# 设置编码方式,不然可能出现乱码,不要问我 为什么知道,因为 它出现了 乱码,然后它是中文的,我就试了下 GBK 编码 是否可以。
requests.encoding = 'GBK'
# with open('../test.html', 'wb') as f:
# f.write(html.content)
return html.text
# 帖子列表
def get_list(text, pn):
print('正在爬取%s ' %(pn + 1))
soup = BeautifulSoup(text, 'html.parser')
# 检查是否被 安全限制了
desc = soup.find(class_='timeout-title')
if desc is not None:
print('被安全限制')
return
# 分为 被置顶的帖子和 没有被置顶的帖子
top_list = soup.find_all(class_='t_con cleafix')
# 存放所有的帖子
post_list = []
for item in top_list:
time.sleep(1)
# 帖子的链接地址
href = item.find(class_='j_th_tit ').get('href')
# 过滤我不想爬取的页面
if href == '/bawu2/errorPage?bz=1':
continue
author = item.find(class_='tb_icon_author')['title']
create_date = item.find(class_='pull-right is_show_create_time').string
answer_count = item.find(class_='threadlist_rep_num center_text').string
post = post_details(base_url + href, author, answer_count, create_date)
post_list.append(post)
# 一页写入一次文件
with open(str(pn)+'.txt','a+',encoding='utf-8') as f:
for post in post_list:
f.write('标题: {} \t 发帖人:{} \t 发帖时间:{} \t 回复数量: {} \n'.format(
post['title'], post['author'], post['createDate'], post['answerCount']))
# 判断是否还有下一页
next_page = soup.find(class_='next pagination-item ')
if next_page is not None:
pn = pn + 50
print('开始爬取下一页')
get_list(get_html(url+'&pn='+str(pn)), pn)
# 帖子详情界面
def post_details(link_url, author, answer_count, create_date):
post = {}
html = get_html(link_url)
soup = BeautifulSoup(html, 'html.parser')
# 帖子标题
post['title'] = soup.find(class_='core_title_txt').string
# 作者
post['author'] = author
# 回复数
post['answerCount'] = answer_count
# 发布日期
post['createDate'] = create_date
# 爬取回复列表
# revert_list = soup.find(id='j_p_postlist').children
# for item in revert_list:
# img = item.find('img')
# if img is None:
# continue
#
# # 回复者名称
# print(img['username'])
# # 回复者头像
# print(img['src'])
# # 回复内容
# print(item.find(class_='j_d_post_content').text)
return post
if __name__ == '__main__':
get_list(get_html(url), pn)
不积跬步无以至千里,送给自己。 end
没什么好抱怨的,今天的每一步,都是在为之前的每一次选择买单,这也叫担当!无论你此刻是否迷茫,在阳光升起的时候,请相信,努力的人最终都有回报。
评论区