下面我为您详细讲解使用Python模拟新浪微博登陆功能的完整攻略。
1.背景
许多爬虫爱好者在进行新浪微博数据爬取时,需要模拟登陆并获取Cookie,才能正常访问需要登录才能查看的内容。所以,模拟新浪微博登陆功能是进行新浪微博爬虫的第一步。本文将使用Python实现模拟登陆功能。
2.实现过程
2.1 获取登陆页面
要进行模拟登陆,首先需要获取登录页面。这可以通过 requests 库获取。
import requests
url = "https://weibo.com/login.php"
r = requests.get(url)
html = r.content
2.2 提取关键信息
在登陆页面中,会包含关键信息:登录地址、登陆需要的参数等。我们需要通过BeautifulSoup库解析HTML页面,提取这些关键信息。
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
form = soup.find_all('form', attrs={"name": "loginform"})[0]
action = form['action']
password_input = form.find_all('input', attrs={"type": "password"})[0]
password_name = password_input['name']
vk = form.find_all('input', attrs={"name": "vk"})[0]['value']
return_url = form.find_all('input', attrs={"name": "return_url"})[0]['value']
我们已经成功获取并解码了必要信息。
2.3 Post数据获取登陆Cookie
获取到了登陆页面和必要的参数,接下来就是模拟登陆过程。为了模拟登录过程,我们需要将用户名和密码通过Post方法提交到登陆页面,以获取Cookie值。这可以通过requests.post完成。
username = "your_username"
password = "your_password"
data = {
'username': username,
password_name: password,
'vk': vk,
'return_url': return_url
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:70.0) Gecko/20100101 Firefox/70.0'
}
session = requests.session()
r = session.post(action, headers=headers, data=data)
这个Post方法将提交登陆信息,例如用户名和密码。如果登陆信息正确,服务器将返回一个包含Cookie值的HTTP Response。我们通过session.cookies获取新Cookie。
2.4 使用Cookie访问需要登陆后才能查看的页面
最后,我们可以使用获取到的Cookie访问需要登录后才能访问的页面。
url = "https://weibo.com/your_username/home"
r = session.get(url, headers=headers)
print(r.text)
如果成功的模拟了登陆,我们将能够获取到个人首页的HTML代码。
3.示例
以下给出两个示例:
示例1
假设我们想要爬取新浪微博中关于Python的数据,但是部分数据是登录后才能被爬取到的。我们可以按照下列代码进行尝试:
import requests
from bs4 import BeautifulSoup
# 登录过程
session = requests.session()
r = session.get("https://weibo.com/login.php")
login_url = "https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.19)"
s = BeautifulSoup(r.content, "html.parser")
loginform = s.find_all('form', {'class': "fm-validate"})[0]
login_data = {}
for inp in loginform.find_all('input'):
if 'name' in inp.attrs and 'value' in inp.attrs:
login_data[inp['name']] = inp['value']
login_data['email'] = "你的账号"
login_data['password'] = "你的密码"
if 'servertime' in login_data and 'nonce' in login_data:
print('login_params fetched!')
else:
print('login_params fetched failed!')
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:70.0) Gecko/20100101 Firefox/70.0'
}
# 登录状态维护
sina_session = requests.session() # 生成session对象
r = sina_session.get(login_url, params=login_data, headers=headers)
sina_session.cookies.update(r.cookies) # 更新cookies
main_url = "https://weibo.com/u/你的微博id"
r = sina_session.get(main_url, headers=headers)
content = r.content.decode('utf-8')
print(content)
示例2
假设我们想要爬取新浪微博中个人主页上的内容,我们可以按照下列代码进行尝试:
import requests
from bs4 import BeautifulSoup
s = requests.session()
# 登录
login_url = 'https://passport.weibo.cn/sso/login'
login_data = {
'username': '你的账号',
'password': '你的密码',
'entry': 'mweibo',
'client_id': '',
'savestate': '1',
'ec': '',
'page_type': 'myprofile',
'loginstatus': '1',
'wentry': '',
'loginfrom': '',
'uid': '',
'regccode': '',
'$': 'undefined',
'sr': '1440*900'
}
r = s.post(login_url, data=login_data)
print(r.content.decode('utf-8'))
# 访问个人主页
page_url = 'https://weibo.cn/your_id'
r = s.get(page_url)
print(r.content.decode('utf-8'))
# 爬取主页内容
content = []
soup = BeautifulSoup(r.content, 'html.parser')
for el in soup.select('div.c'):
try:
d = {}
# 发布时间和来源
d['datetime'], d['source'] = el('span', 'ct')[0].get_text().split(maxsplit=1)
# 发布内容
d['content'] = el.select('div span.ctt')[0].get_text()
# 转发和评论统计
d['repost'], d['like'], d['comment'] = [int(num) for num in el.select('div span')[-4::2]]
# 点赞用户
like_span = el.select('div span.afpc > a')
if like_span:
d['like_users'] = [a.get_text() for a in like_span if a.get_text().strip()]
else:
d['like_users'] = []
content.append(d)
except Exception as ex:
# 爬取失败
print('Error: ', ex)
print(content)
以上就是模拟新浪微博登陆功能的完整攻略了。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python模拟新浪微博登陆功能(新浪微博爬虫) - Python技术站