scrapy多cookies+ip代理稳定爬取微博m站评论以及子评论
为了以后的深度学习可以爬取更多更好的语料以及其他资源,先拿weibo移动端试了下手(果然一进就全是坑~)
- 1、分析weibo登陆以获取cookies
- 1)预请求获取服务器信息
- 2)构建请求登陆url
- 3)登陆跳转
- 2、m站请求隐藏细节
- 1)分析请求
- 注意事项
- 3、scrapy开启爬取
- 爬虫结果
具体scrapy可以联系我获取哦~
1、分析weibo登陆以获取cookies
1)预请求获取服务器信息
- 请求的url
pre_url = "http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack" \
"&su=" + su + "&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.19)&_=" + str(int(time.time() * 1000))
- 其中su是加密后的用户名 最后的是当前时间戳
- su的加密方式如下
username_quote = quote_plus(self.username)
username_base64 = base64.b64encode(username_quote.encode("utf-8"))
return username_base64.decode("utf-8")
得到服务器信息用于构建请求登陆的url
具体的含义就不解释啦 需要的小伙伴可自行百度~
2)构建请求登陆url
self.form_data = {'entry': 'weibo','gateway': '1','from': '','savestate': '7','useticket': '1','pagerefer': "https://passport.weibo.com",'vsnf': '1','su': su,'service': 'miniblog','servertime': server_time,'nonce': nonce,'pwencode': 'rsa2','rsakv': rsakv,'sp': password_secret,'sr': '1366*768','encoding': 'UTF-8','prelt': '115',"cdult": "38",'url': 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack','returntype': 'TEXT'}
- 其中密码加密
"""对密码进行 RSA 的加密"""
rsaPublickey = int(pubkey, 16)
key = rsa.PublicKey(rsaPublickey, 65537) # 创建公钥
message = str(server_time) + '\t' + str(nonce) + '\n' + str(self.password) # 拼接明文js加密文件中得到
message = message.encode("utf-8")
ps = rsa.encrypt(message, key) # 加密
ps = binascii.b2a_hex(ps) # 将加密信息转换为16进制
return ps
- 登陆url
login_url = 'https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.19)&_'
login_url = login_url + str(time.time() * 1000)
- 一般需要输入验证码 利用服务器数据pcid 请求并获取验证码
- 请求验证码url
cha_url = "https://login.sina.com.cn/cgi/pin.php?r="
cha_url = cha_url + str(int(random.random() * 100000000)) + "&s=0&p=" + p_cid
- 保存到本地并打开输出即可
- 后期会使用神经网络进行验证码识别
3)登陆跳转
- 从登陆请求中得到的response
- 提取ticket
'ticket': 'XXX'
- 并从其中匹配出ssosavestate
save_pattern = r'==-(\d+)-'
ssosavestate = int(re.findall(save_pattern, ticket)[0]) + 3600 * 7
- 构造params v1.4.18->v1.4.19
"callback": "sinaSSOController.callbackLoginStatus",
"ticket": ticket,
"ssosavestate": str(ssosavestate),
"client": "ssologin.js(v1.4.19)",
"_": str(time.time() * 1000),
- 以及url和header
jump_url = "https://passport.weibo.com/wbsso/login"
jump_headers = {"Host": "passport.weibo.com","Referer": "https://weibo.com/","User-Agent": headers["User-Agent"]}
- 再从respones获取uid 构造url
web_wb_url = "http://weibo.com/%s/profile?topnav=1&wvr=6&is_all=1" % uuid_res
- 跳转m站请求
https://passport.weibo.cn/sso/crossdomain?service=sinawap&display=0&ssosavestate='ssosavestate'&url=https%3A%2F%2Fm.weibo.cn%2Fdetail%2F4513513248445166%3Fsudaref%3Dlogin.sina.com.cn&display=0&ticket='ticket'&retcode=0
- 登陆已经成功 下一步跳转m站
m_Params = {"url": "https://m.weibo.cn/","_rand": _rand,"gateway": "1","service": "sinawap","entry": "sinawap","useticket": "1","returntype": "META","sudaref": "","_client_version": "0.6.26",}
m_url = "https://login.sina.com.cn/sso/login.php"
- 保存cookies 使用了LWPCookieJar
self.session.cookies = ck.LWPCookieJar(filename=self.cookies_path)
# 保存
self.session.cookies.save()
- 扫描cookies文件
for file in os.listdir(cookie_files):if file.endswith('.txt'):cookies_temp = ck.LWPCookieJar(cookie_files + "/" + file)cookies_temp.load(ignore_discard=True, ignore_expires=True)self.cookie_dict.append(requests.utils.dict_from_cookiejar(cookies_temp))
- 在中间件随机或者顺抽取一个即可 因为访问需要带上cookies哦~
通过此次爬虫测试 发现m站对ip地址ban得不狠 但还是不能太频繁 否则也会被“求着歇歇” 反而是对账号比较敏感 账号可以说是越多越好 三个感觉已经足够 但文明爬虫 请求的频率还是得慢点~
2、m站请求隐藏细节
1)分析请求
- ajax加载方式
- 首页评论加载的请求 是固定的 只有id和mid不同 都是博客id
https://m.weibo.cn/comments/hotflow?id=4513513248445166&mid=4513513248445166&max_id_type=0
- 下一页的请求
https://m.weibo.cn/comments/hotflow?id=4513513248445166&mid=4513513248445166&max_id=216909405545407&max_id_type=0
不同之处
1、多了max_id
2、max_id_type的值也不固定为0
那么该去哪里找max_id和max_id_type
再看response
当前页面的max_id和max_id_type可以在上一页的response中找到
如此一来 就可以愉快的进行爬取啦~
子评论
子评论首页请求
https://m.weibo.cn/comments/hotFlowChild?cid=4513525815570069&max_id=0&max_id_type=0
cid:父评论的id
max_id:与父评论max_id一致
max_id_type:与父评论max_id_type一致
子评论其他页请求
https://m.weibo.cn/comments/hotFlowChild?cid=4513525815570069&max_id=4513615728599918&max_id_type=0
与父级评论一致 只需要确保cid唯一即可
注意事项
1、首页评论请求可以无限次访问
2、其他页请求只能访问两次 再多就会返回{‘ok’:‘0’}
3、严格按照顺序访问
4、并且max_id是递减的 个人觉得其生成方式是按照先后顺序的 就是对于某一页评论 不是单纯的当前博客评论页 而是所有的博客的评论页生成的先后顺序
5、max_id_type目前值见到0/1 并且当max_id_type为0时 max_id长度比较长 当max_id_type为1时 max_id长度比较短 猜测是两个不同的生成原理
6、最后一页判断 max_id会再次返回来0
3、scrapy开启爬取
话不多说 上代码~
- 下载中间件
DOWNLOADER_MIDDLEWARES = {'mWeiBo.middlewares.MweiboDownloaderMiddleware': 543,'mWeiBo.middlewares.UserAgentDownloaderMiddleware': 300,'mWeiBo.middlewares.CookiesDownloaderMiddleware': 200,'mWeiBo.middlewares.IpProxyDownloaderMiddleware': 100,
}
- spider主逻辑
class MweiboSpider(scrapy.Spider):name = 'mweibo'allowed_domains = ['m.weibo.cn']# 初始化def __init__(self):super(MweiboSpider, self).__init__()self.count = 0# 博客idself.wb_id = '4513496224687345'self.url = 'https://m.weibo.cn/comments/hotflow?id=' + self.wb_id + '&mid=' + self.wb_id + '&max_id_type=0'# 加载cookiecookies_path = "/Users/sugarmei/mWeiBo/mWeiBo/spiders/cookies_files/cookies2.txt"cookies = ck.LWPCookieJar(cookies_path)cookies.load(ignore_discard=True, ignore_expires=True)# 将cookie转换成字典self.cookie_dict = requests.utils.dict_from_cookiejar(cookies)def start_requests(self):# 开始发布请求任务yield scrapy.Request(url=self.url, cookies=self.cookie_dict, callback=self.parse, errback=self.error)def parse(self, response):# 当前ip被ban 继续ip代理请求if response.status == 403:yield scrapy.Request(url=response.url, cookies=self.cookie_dict, callback=self.parse, dont_filter=True)# 发生异常data = json.loads(response.text)if data['ok'] == 0:time.sleep(2)print("请求数据为空 重新发出请求")yield scrapy.Request(url=response.url, cookies=self.cookie_dict, callback=self.parse, dont_filter=True)else:# 拼接urlmax_id = data['data']['max_id']max_id_type = data['data']['max_id_type']if data['data']['max_id'] == 0:print("此次评论爬取结束!")returnurl_max = 'https://m.weibo.cn/comments/hotflow?id=' + self.wb_id + '&mid=' + self.wb_id + '&max_id=' + str(max_id) + '&max_id_type=' + str(max_id_type)# 拿到其中的textfor comment in data['data']['data']:# 数据持久化item = MweiboItem()item['username'] = comment['text']item['comment'] = comment['user']['screen_name']self.count += 1yield itemprint("当前获取了共 " + str(self.count) + " 条评论")yield scrapy.Request(url=url_max, cookies=self.cookie_dict, callback=self.parse, dont_filter=False)
爬虫结果
- 大学升作弊被捉坠亡学校应该担责吗
- 没有爬取子评论
- 加上爬取子评论的功能
- 需要判断是否有恢复 more_info_type不为0即可
- 加上子评论代码
# more_info_type为0的评论没有回复
if comment['more_info_type'] != 0:print('该评论有人回复', "回复数量:", comment['total_number'])# 每次的cid都不一样 但是需要获取子评论 都要从cid = comment['rootid']# 在循环里面发出爬取该评论回复的请求max_id=0&max_id_type=0参数开始url_sub = "https://m.weibo.cn/comments/hotFlowChild?cid=" + cid + "&max_id=0&max_id_type=0"yield scrapy.Request(url=url_sub, cookies=self.cookie_dict, callback=self.parse_sub,dont_filter=False)
# 处理子评论
def parse_sub(self, response):# 有些评论是没有回复的 需要做判断data = json.loads(response.text)if data['ok'] == 0:yield scrapy.Request(url=response.url, cookies=self.cookie_dict, callback=self.parse_sub, dont_filter=True)else:# 与之前一致 先找到max_id和max_id_typemax_id = data['max_id']max_id_type = data['max_id_type']cid = data['rootComment'][0]['id']# 结束条件if max_id == 0:print(str(cid) + ":子评论爬取结束!")return# 否则url_max_sub = "https://m.weibo.cn/comments/hotFlowChild?cid=" + str(cid) + "&max_id=" + str(max_id) + "&max_id_type=" + str(max_id_type)for sub_comment in data['data']:# 数据库持久化# 数据持久化item = MweiboItem()item['rootid'] = str(cid)item['refid'] = '0'item['comment'] = sub_comment['text']item['username'] = sub_comment['user']['screen_name']self.sub_count += 1yield itemyield scrapy.Request(url=url_max_sub, cookies=self.cookie_dict, callback=self.parse_sub, dont_filter=True)
- 有其他想法的朋友可以一起交流哦 需要完整代码的也可以联系我
scrapy多cookies+ip代理稳定爬取微博m站评论以及子评论相关推荐
- Python爬虫:运用多线程、IP代理模块爬取百度图片上小姐姐的图片
Python爬虫:运用多线程.IP代理模块爬取百度图片上小姐姐的图片 1.爬取输入类型的图片数量(用于给用户提示) 使用过百度图片的读者会发现,在搜索栏上输入关键词之后,会显示出搜索的结果,小编想大多 ...
- 5 使用ip代理池爬取糗事百科
从09年读本科开始学计算机以来,一直在迷茫中度过,很想学些东西,做些事情,却往往陷进一些技术细节而蹉跎时光.直到最近几个月,才明白程序员的意义并不是要搞清楚所有代码细节,而是要有更宏高的方向,要有更专 ...
- python爬取微博评论超100页_python爬取新浪微博评论-Go语言中文社区
简介 爬取微博m站评论.由于api限制只能爬取前100页,如果想要更全数据需爬pc端. 工具 python 3.5 requests库 re库 步骤 1. 登陆保存cookie 首先,打开m.weib ...
- python爬取微博文本_Python爬虫爬取新浪微博内容示例【基于代理IP】
本文实例讲述了Python爬虫爬取新浪微博内容.分享给大家供大家参考,具体如下: 用Python编写爬虫,爬取微博大V的微博内容,本文以女神的微博为例(爬新浪m站:https://m.weibo.cn ...
- urllib.request 设置代理进行爬取,防止被封IP,各种hander高级用法
import urllib.request proxy_handler = urllib.request.ProxyHandler({ 'http': 'http://127.0.0.1:9743', ...
- Urllib库函数、代理、爬取案例
Urllib库函数.代理.爬取案例 urllib库-urlopen函数用法 from urllib import request resp=request.urlopen('http://www.ba ...
- 爬虫-代理的爬取练习191110
练习 抓取代理网站 国内高匿免费HTTP代理IP__第1页国内高匿 https://www.xicidaili.com/nn/ 爬三页数据 爬到的代理 存ip , 端口,请求方式 proxie_lis ...
- 利用Scrapy框架爬取LOL皮肤站高清壁纸
利用Scrapy框架爬取LOL皮肤站高清壁纸 Lan 2020-03-06 21:22 81 人阅读 0 条评论 成品打包:点击进入 代码: 爬虫文件 # -*- coding: utf- ...
- 爬虫实战(一)—利用requests、mongo、redis代理池爬取英雄联盟opgg实时英雄数据
概述 可关注微信订阅号 loak 查看实际效果. 代码已托管github,地址为:https://github.com/luozhengszj/LOLGokSpider 包括了项目的所有代码. 此篇文 ...
最新文章
- LeetCode 496. 下一个更大元素 I 解题思路及C++实现
- 天气小工具新增风格-默认无背景,感谢欧阳兄制作
- 《大话数据结构》第9章 排序 9.9 快速排序(下)
- [SAP ABAP开发技术总结]选择屏幕——SELECT-OPTIONS
- 在数据库插入带小数点数据的问题
- 利用GAN原始框架生成手写数字
- 2021-02-03-延长一天时间的有效方法
- HDU 4031 Attack(线段树/树状数组区间更新单点查询+暴力)
- 一些Python的惯用法和小技巧:Pythonic
- 【市场人必备】100份500强企业营销传播方案,小白晋升大神。
- 平均曲率、主曲率和高斯曲率
- 基于Spark的电影推荐系统(毕业设计)
- ictclas4j java_ictclas4j 分词工具包 安装流程
- volatile的区别
- [个人开发者赚钱五]植入广告等获取收益
- 串口调试助手 Alien V0.238
- 图像的平均梯度AG,信息熵IE,峰值信噪比PSNR,平均值,SSIM(matlab)
- 自然资源数据治理方案
- 突破宽带共享路由限制的方法探讨
- 运输问题系数矩阵matlab,基于MATLAB的运输问题求解方法.pdf
热门文章
- 一篇好文,以在迷茫时阅读(文章转载自CSDN)
- 计算机原理实验红绿灯转换,微机原理与应用的5个实验 包含8086扩展,8255交通灯,DEBUG程序,数码显示...
- hnust 懒人多动脑
- 中科院分区表中分区上升的TOP期刊, 最快仅1-2个月录用
- linux统计函数调用次数实验,统计linux系统调用的次数
- 雄关漫道真如铁,而今迈步从头越.
- Error in DESeqDataSet(se, design = design, ignoreRank) : some values in assay are not integers
- 变相激发FileUpload事件
- 红旗linux 硬件,红旗软硬件兼容性查询 | 中科红旗
- 工业网关需要具备的能力及分类