python+selenium+requests 爬虫贴吧回复数点赞数分享数以及其他信息
程序员文章站
2024-03-21 18:06:58
...
web贴吧爬取
贴吧app抓包爬取
贴吧其他途径爬取
首先的我们先运用我们的属性的web来爬取贴吧的帖子,我们进入pc端的某个吧的贴吧,点进去某个帖子开始获取回复数
好了开始上粗略点的python2.7+ selenium代码了
#coding:utf-8
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument('--disable-gpu')
datas= []
browser = webdriver.Chrome()
## 爬取贴吧阴阳师百闻牌吧
def crawl_tieba(url):
"""
param: url 需要爬取的贴吧的链接
return: None
"""
browser.get(url)
## 我们这里只爬取前两页做示范就好了
num = 1
while num <3:
## 我们找到thread_list存放的位置的id
thread_list = browser.find_element_by_id("thread_list")
j_thread_lists = thread_list.find_elements_by_class_name(" j_thread_list")
for j_thread in j_thread_lists:
##
for i in j_thread.find_elements_by_class_name("j_th_tit"):
if i.get_attribute("href"):
## 这样就把所有的想要的帖子链接都装进一个列表里面
datas.append(i.get_attribute("href"))
num +=1
def crawl_thread(url):
"""
param: 单个帖子的url
return: None
"""
browser.get(url)
thread_theme_5 = browser.find_element_by_class_name("thread_theme_5")
l_reply_num = thread_theme_5.find_element_by_class_name("l_reply_num")
red = l_reply_num.find_element_by_class_name("red")
print red.text
crawl_tieba("https://tieba.baidu.com/f?kw=%E9%98%B4%E9%98%B3%E5%B8%88%E7%99%BE%E9%97%BB%E7%89%8C&ie=utf-8&pn=0")
crawl_thread(datas[0])
browser.close()
到这的话我们是已经获取了阴阳师百闻牌前两页帖子的数量,并且存到的datas当中,获取到第一条帖子的回复数
到这我话我们web目前是不会
我们通过fiddler也没发现什么可用的接口,抓包app也没有,笔者寻找了许久发现还是有别人的路径可用的
接下来我们开始获取帖子的回复数分享数等等其他想要并且公开的数据
笔者找到一个开放出来的api 用postman请求之后得到他会返回三个数据如下图所示的reply,like,recommed
这样子看起来可能还是有些不够清晰接下来我们看看我们在里面想要的结果
如上图所示的相关字段就是我们想要的字段啦,下面我们用requests来请求接口获取相应的数据
import requests
def replay_share_num(url):
"""
param: url为贴吧的单条帖子链接
return: dictionary
"""
## 通过观察所获取的帖子不难发现地址后面都是没有带?等等其他的参数的这样子我们就很好办了
## 连正则表达式都不要写
## 我们直接通过rfind("/")
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) \
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3573.0 Safari/537.36",
'Connection': 'close',
}
thread_id = url[url.rfind("/") +1 :]
_url = "https://tieba.baidu.com/mo/q/pb/page/m?kz=%s&fr=newshare&r=2&m=11" % thread_id
## 记得处理一下异常
try:
## 请求的我们的加上个请求超时时间,一般的请求都会在1秒完成,特别是像贴吧这些大厂就
## 更追求用户的体验了,所以我们这里的超时时间最坏的情况下设置5s就ok啦
req = requests.get(_url, headers=headers, verify=False, timeout=5)
## 判断一下请求是否成功
if req.status_code==200 :
## 返回的是一个json对象
req_d = req.json()
## 数据的位置在data---> thread下我们获取一下这个thread
thread = req_d.get("data",dict()).get("thread",dict())
if thread:
## 获取回复数
reply_num = thread.get("reply_num", 0)
## 获取分享数
share_num = thread.get("share_num", 0)
## 获取点赞数
agree_num = thread.get("agree", dict()).get("agree_num", 0)
print reply_num, share_num, agree_num
return {"reply_num": reply_num, "share_num": share_num, "agree_num": agree_num}
return {"error": "获取数据异常了"}
except Exception as e:
return {"error": "异常了"}
到这里的话我们想要获取的某个帖子的回复数,点赞数,分享数就获取完成啦
下面贴下完整的代码
#coding:utf-8
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import requests
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument('--disable-gpu')
datas= []
browser = webdriver.Chrome()
## 爬取贴吧阴阳师百闻牌吧
def crawl_tieba(url):
"""
param: url 需要爬取的贴吧的链接
return: None
"""
browser.get(url)
## 我们这里只爬取前两页做示范就好了
num = 1
while num <3:
## 我们找到thread_list存放的位置的id
thread_list = browser.find_element_by_id("thread_list")
j_thread_lists = thread_list.find_elements_by_class_name(" j_thread_list")
for j_thread in j_thread_lists:
##
for i in j_thread.find_elements_by_class_name("j_th_tit"):
if i.get_attribute("href"):
## 这样就把所有的想要的帖子链接都装进一个列表里面
datas.append(i.get_attribute("href"))
num +=1
def crawl_thread(url):
"""
param: 单个帖子的url
return: None
"""
browser.get(url)
thread_theme_5 = browser.find_element_by_class_name("thread_theme_5")
l_reply_num = thread_theme_5.find_element_by_class_name("l_reply_num")
red = l_reply_num.find_element_by_class_name("red")
print red.text
def replay_share_num(url):
"""
param: url为贴吧的单条帖子链接
return: dictionary
"""
## 通过观察所获取的帖子不难发现地址后面都是没有带?等等其他的参数的这样子我们就很好办了
## 连正则表达式都不要写
## 我们直接通过rfind("/")
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) \
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3573.0 Safari/537.36",
'Connection': 'close',
}
thread_id = url[url.rfind("/") +1 :]
_url = "https://tieba.baidu.com/mo/q/pb/page/m?kz=%s&fr=newshare&r=2&m=11" % thread_id
## 记得处理一下异常
try:
## 请求的我们的加上个请求超时时间,一般的请求都会在1秒完成,特别是像贴吧这些大厂就
## 更追求用户的体验了,所以我们这里的超时时间最坏的情况下设置5s就ok啦
req = requests.get(_url, headers=headers, verify=False, timeout=5)
## 判断一下请求是否成功
if req.status_code==200 :
## 返回的是一个json对象
req_d = req.json()
## 数据的位置在data---> thread下我们获取一下这个thread
thread = req_d.get("data",dict()).get("thread",dict())
if thread:
## 获取回复数
reply_num = thread.get("reply_num", 0)
## 获取分享数
share_num = thread.get("share_num", 0)
## 获取点赞数
agree_num = thread.get("agree", dict()).get("agree_num", 0)
print reply_num, share_num, agree_num
return {"reply_num": reply_num, "share_num": share_num, "agree_num": agree_num}
return {"error": "获取数据异常了"}
except Exception as e:
return {"error": "异常了"}
crawl_tieba("https://tieba.baidu.com/f?kw=%E9%98%B4%E9%98%B3%E5%B8%88%E7%99%BE%E9%97%BB%E7%89%8C&ie=utf-8&pn=0")
crawl_thread(datas[0])
replay_share_num(datas[0])
browser.close()
备注:笔者主要为python web开发工程师,下集准备爬取下今日头条的文章类的阅读数
上一篇: mysql高级查询语句