版权声明:Author:WangLei https://blog.csdn.net/qq_41287993/article/details/84582372
今天给的一个爬虫小事例,贴吧段子爬取这样一个小功能,数据呢仅仅娱乐,没有恶意想法
若有侵权,请私信删除
- 此次用到的一个解析库Beautiful Soup,更轻量简单地对数据进行解析,已获得目标数据
- 贴吧做的还是比较好,有一定的反爬机制,所以我们也应该有一定的应对措施,具体对应我们requests获取到的数据对应页面源代码,通过观察发现数据的是否异步与注释等等反爬问题
- 以下是代码部分
# -*- coding:utf-8 -*-
from bs4 import BeautifulSoup
import requests
import re
import time
import urllib.parse
'''
Author:王磊
Time :2018/11/27 20:22:36
'''
header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0"}
def getHTML(url):
'''
通过url获取html
:param url:
:return:htmlStrs
'''
res = requests.get(url, headers=header)
html = res.content.decode('utf-8', 'ignore')
html = html.replace("<!--", "")
html = html.replace("-->", "")
return html
def parseSaveData(html):
'''
通过html代码解析数据并保存
:param html:
:return:None
'''
soup = BeautifulSoup(html, 'html.parser')
# req = re.compile(r'<span.*?class="tb_icon_author.*?".*?>.*?</span>', re.S)
# print(re.findall(req, html))
# 每条帖子数据
uls = soup.findAll('li', attrs={"class": re.compile(r'j_thread_list.*?')})
lens = len(uls)
with open('C:\\Users\\asus\\Desktop\\pc\\text\\tieba.txt', 'a', encoding='gbk') as f:
for i in range(lens):
Utitle = uls[i].findAll('a', attrs={"rel": re.compile(r'noreferrer.*?')})[0]['title']
Uauthor = uls[i].findAll('span', attrs={"class": re.compile(r'tb_icon_author.*?')})[0]['title']
print(Utitle)
print(Uauthor)
print("*" * 50)
Utitle = (Utitle + '\r\n').encode("GBK", 'ignore').decode('gbk')
Uauthor = (Uauthor + '\r\n').encode("GBK", 'ignore').decode('gbk')
f.write(Utitle)
f.write(Uauthor)
f.write("*" * 50 + '\r\n')
def getPages(html):
'''
通过html获取当前贴吧总帖子页数
:param html:
:return: pageNums
'''
soup = BeautifulSoup(html, 'html.parser')
endPages = soup.findAll('a', attrs={"class": re.compile(r'last.*?pagination-item.*?')})
return int(urllib.parse.urlparse('http://' + endPages[0]['href'])[4].split("=")[3])
def main():
'''
入口函数
:return:None
'''
name = urllib.parse.quote('电子科技大学成都学院')
url = 'http://tieba.baidu.com/f?kw=' + name + '&ie=utf-8&pn=0'
# 获取数据
html = getHTML(url)
# 获取页面数
pages = getPages(html)
# 循环获取页数据并存储
index = 0
for i in range(pages):
url = 'http://tieba.baidu.com/f?kw=' + name + '&ie=utf-8&pn=' + str(index)
#分析保存数据
parseSaveData(html)
index += 50
time.sleep(3)
if __name__ == '__main__':
main()
♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪
♪♪后续会更新系列基于Python的爬虫小例子,欢迎关注。♪♪
♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪