python爬虫手把手教你抓取微博评论(完整代码)爬虫手把手教你抓取微博评论(完整代码)
前几天周子瑜捐款的事情引发粉丝和黑子大战,突然想了解其中的对话前几天周子瑜捐款的事情引发粉丝和黑子大战,突然想了解其中的对话
不想看的朋友可以直接跳到最后拿代码不想看的朋友可以直接跳到最后拿代码
开始工作开始工作
第一步引入库第一步引入库
import time
import base64
import rsa
import binascii
import requests
import re
from PIL import Image
import random
from urllib.parse import quote_plus
import http.cookiejar as cookielib
import csv
import os
第二步:一些全局变量的设置第二步:一些全局变量的设置
comment_path = 'comment'
agent = 'mozilla/5.0 (windowS NT 10.0; win64; x64) appLewEbkit/537.36 (KHTML, likE gecko) chrome/71.0.3578.98 safari/537.36'
headers = {'User-Agent': agent}
第三步:创立目录作为存放数据的第三步:创立目录作为存放数据的
if not os.path.exists(comment_path):
os.mkdir(comment_path)
第四步:登陆类的创立第四步:登陆类的创立
class WeiboLogin(object):
"""
通过登录 weibo.com 然后跳转到 m.weibo.cn
"""
# 初始化数据
def __init__(self, user, password, cookie_path):
super(WeiboLogin, self).__init__()
self.user = user
self.password = password
self.session = requests.Session()
self.cookie_path = cookie_path
# LWPCookieJar是python中管理cookie的工具,可以将cookie保存到文件,或者在文件中读取cookie数据到程序
self.session.cookies = cookielib.LWPCookieJar(filename=self.cookie_path)
self.index_url = "http://weibo.com/login.php"
self.session.get(self.index_url, headers=headers, timeout=2)
self.postdata = dict()
def get_su(self):
"""
对 email 地址和手机号码 先 javascript 中 encodeURIComponent
对应 Python 3 中的是 urllib.parse.quote_plus
然后在 base64 加密后decode
"""
username_quote = quote_plus(self.user)
username_base64 = base64.b64encode(username_quote.encode("utf-8"))
return username_base64.decode("utf-8")
# 预登陆获得 servertime, nonce, pubkey, rsakv
def get_server_data(self, su):
"""与原来的相比,微博的登录从 v1.4.18 升级到了 v1.4.19
这里使用了 URL 拼接的方式,也可以用 Params 参数传递的方式
"""
pre_url = "http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su="
pre_url = pre_url + su + "&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.19)&_="
pre_url = pre_url + str(int(time.time() * 1000))
pre_data_res = self.session.get(pre_url, headers=headers)
# print("*"*50)
# print(pre_data_res.text)
# print("*" * 50)
sever_data = eval(pre_data_res.content.decode("utf-8").replace("sinaSSOController.preloginCallBack", ''))
return sever_data
def get_password(self, servertime, nonce, pubkey):
"""对密码进行 RSA 的加密"""
rsaPublickey = int(pubkey, 16)
key = rsa.PublicKey(rsaPublickey, 65537) # 创建公钥
message = str(servertime) + ' ' + str(nonce) + '' + str(self.password) # 拼接明文js加密文件中得到
message = message.encode("utf-8")
passwd = rsa.encrypt(message, key) # 加密
passwd = binascii.b2a_hex(passwd) # 将加密信息转换为16进制。
return passwd
def get_cha(self, pcid):
"""获取验证码,并且用PIL打开,
1. 如果本机安装了图片查看软件,也可以用 os.subprocess 的打开验证码
2. 可以改写此函数接入打码平台。
"""
cha_url = "https://login.sina.com.cn/cgi/pin.php?r="
cha_url = cha_url + str(int(random.random() * 100000000)) + "&s=0&p="
cha_url = cha_url + pcid
cha_page = self.session.get(cha_url, headers=headers)
with open("cha.jpg", 'wb') as f:
f.write(cha_page.content)
f.close()
try:
im = Image.open("cha.jpg")
im.show()
im.close()
except Exception as e:
评论0