python爬虫求助,网页数据抓回来显示{"ok":0}
抓取微博评论数据,经过前期的一番操作,发现微博移动端数据格式比较清晰,比网页端好抓取,在浏览器端进入检查界面,模拟手机端访问,代码里设置了对应手机端的cookies,从图1可以看到我找到的评论数据在的地址,hotflow开头的地址,右边显示的是里面json格式的数据,图2是我通过代码抓回来的结果,现在存在这样一个问题,浏览器模拟移动端微博的界面刷新一下,可以得到图2的结果,数据能通过代码爬下来,但是再次运行代码会得到图3,网页状态是200,但是内容显示{"ok":0},没有其他数据,我现在只能手动刷新微博界面才能抓到数据,代码自己运行获取不到,隔一段时间运行也不行,既然手动刷新之后能够抓下来数据,那我的抓取地址和用户模拟登陆应该没问题吧,这是微博的反爬机制吗?请教论坛各位大佬,这个问题怎么解决? 代码粘出来 这是我发的帖子,https://fishc.com.cn/thread-179792-1-1.html你的这个爬取评论和我这个是类似的,不需要cookie,也不需要登陆就可以爬了吧,没出现刷新几次获取不到的问题,要么就是刷新太频繁了,稍微加个time.sleep试试
import requests
import json
url='https://m.weibo.cn/comments/hotflow'
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'}
param={'id': '4554241068251088',
'mid': '4554241068251088'}
response = requests.get(url, headers=headers,params=param)
html_str=response.content.decode()
print(json.loads(html_str)) 疾风怪盗 发表于 2020-10-28 18:41
这是我发的帖子,https://fishc.com.cn/thread-179792-1-1.html
你的这个爬取评论和我这个是类似的,不需 ...
可能不是抓取得太频繁,因为隔了好几分钟之后抓取还是一样为空 均昊山 发表于 2020-10-28 18:35
代码粘出来
import json
import pandas
import requests
from bs4 import BeautifulSoup
import time
import random
import csv
cookies={
'Accept':'application/json, text/plain, */*',
'Accept-Encoding':'gzip, deflate, br',
'Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Connection':'keep-alive',
'Cookie':'XSRF-TOKEN=a8637b; WEIBOCN_FROM=1110006030; MLOGIN=1; M_WEIBOCN_PARAMS=from%3Dpage_1001061925694254_profile%26oid%3D4341943448410727%26luicode%3D20000061%26lfid%3D4558599567448599%26uicode%3D20000061%26fid%3D4341943448410727; loginScene=102003; SUB=_2A25ynWtbDeRhGeVP7FAV8y3OyDiIHXVufnUTrDV6PUJbkdAKLVXckW1NTOPEyyCKN8fWKgTZSR87tLPlVkVV9m0K; SUHB=0sqBPJ7_yIjGMS; _T_WM=66965420006',
'Host':'m.weibo.cn',
'MWeibo-Pwa':'1',
'Referer':'https://m.weibo.cn/detail/4558599567448599',
'User-Agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
'X-Requested-With':'XMLHttpRequest',
'X-XSRF-TOKEN':'deea1b'
}
#抓取单页面内的标题、时间、正文
def getNewsDetail(data):
result = {}
try:
result['内容'] = data['text'].strip()
result['点赞数'] = data['like_count']
result['评论数'] = data['total_number']
result['评论人'] = data['user']['screen_name']
result['评论时间'] = data['created_at']
except:
print('shibai')
return result
def parseListLinks(data):
newsdetails = []
for ent in data['data']['data']:
try:
newsdetails.append(getNewsDetail(ent))
except:
print('shibai')
return newsdetails
url = 'https://m.weibo.cn/comments/hotflow?id=4341943448410727&mid=4341943448410727&max_id_type=0'
b=0#page
for i in range(1,5):
news_total = []
res = requests.get(url,cookies=cookies)
res.encoding = 'utf-8'
jd = json.loads(res.text)
max_id = str(jd['data']['max_id'])
newsary = parseListLinks(jd)
news_total.extend(newsary)
df = pandas.DataFrame(news_total)
df.to_csv('20101028test.csv',mode='a',encoding='utf-8')
b+=1
print('page=',b)
url = 'https://m.weibo.cn/comments/hotflow?id=4341943448410727&mid=4341943448410727&max_id='+max_id+'&max_id_type=0'
print(url)
time.sleep(random.randint(3,8))
代码差不多就这些,我是在jupyter notebook里运行的,所以没怎么规整,一块是一块,后面的还没用到,因为抓取第一页不会出问题,从url第一次变更就会有问题。代码多的不用看,光运行下面这一部分就会有问题。
import json
import requests
cookies={
'Accept':'application/json, text/plain, */*',
'Accept-Encoding':'gzip, deflate, br',
'Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Connection':'keep-alive',
'Cookie':'XSRF-TOKEN=a8637b; WEIBOCN_FROM=1110006030; MLOGIN=1; M_WEIBOCN_PARAMS=from%3Dpage_1001061925694254_profile%26oid%3D4341943448410727%26luicode%3D20000061%26lfid%3D4558599567448599%26uicode%3D20000061%26fid%3D4341943448410727; loginScene=102003; SUB=_2A25ynWtbDeRhGeVP7FAV8y3OyDiIHXVufnUTrDV6PUJbkdAKLVXckW1NTOPEyyCKN8fWKgTZSR87tLPlVkVV9m0K; SUHB=0sqBPJ7_yIjGMS; _T_WM=66965420006',
'Host':'m.weibo.cn',
'MWeibo-Pwa':'1',
'Referer':'https://m.weibo.cn/detail/4558599567448599',
'User-Agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
'X-Requested-With':'XMLHttpRequest',
'X-XSRF-TOKEN':'deea1b'
}
url='https://m.weibo.cn/comments/hotflow?id=4558599567448599&mid=4558599567448599&max_id=167296692120734&max_id_type=0'
res = requests.get(url,cookies=cookies)
print(res)
print(res.text)
0zero0 发表于 2020-10-28 21:37
可能不是抓取得太频繁,因为隔了好几分钟之后抓取还是一样为空
但是我写的,没问题啊,试过好几次,一直能抓取,要么你试试看,没用到cookie 疾风怪盗 发表于 2020-10-28 21:48
但是我写的,没问题啊,试过好几次,一直能抓取,要么你试试看,没用到cookie
好的,我试下 疾风怪盗 发表于 2020-10-28 21:48
但是我写的,没问题啊,试过好几次,一直能抓取,要么你试试看,没用到cookie
我用你这个方法试了下我要抓取的网页发现不行,你要是有空帮忙试下我这类网址,
https://m.weibo.cn/comments/hotflow?id=4558599567448599&mid=4558599567448599&max_id=167296692120734&max_id_type=0 0zero0 发表于 2020-10-28 21:56
我用你这个方法试了下我要抓取的网页发现不行,你要是有空帮忙试下我这类网址,
https://m.weibo.cn/com ...
不行?是什么意思?报错是什么?这类网站?都是新浪微博,也没有其他家了吧
你把想要的主页,数据截图贴出来 疾风怪盗 发表于 2020-10-28 22:08
不行?是什么意思?报错是什么?这类网站?都是新浪微博,也没有其他家了吧
你把想要的主页,数据截 ...
好的,稍等 疾风怪盗 发表于 2020-10-28 22:08
不行?是什么意思?报错是什么?这类网站?都是新浪微博,也没有其他家了吧
你把想要的主页,数据截 ...
我先复制了下你的代码,这个能抓下来数据,见图1,我的方法抓你这个页面也能,你现在抓取的网址应该是这个吧:https://m.weibo.cn/comments/hotflow?id=4554241068251088&mid=4341943448410727&max_id_type=0,我现在想抓取这个页面紧接着的下一个页面,从刚刚抓取下来的页面分析出下个页面的max_id为138984018169668,见图2,所以下个承载数据的连接地址为:
https://m.weibo.cn/comments/hotflow?id=4554241068251088&mid=4554241068251088&max_id=138984018169668&max_id_type=0,我现在想抓取的就是这个页面里的数据。 疾风怪盗 发表于 2020-10-28 22:08
不行?是什么意思?报错是什么?这类网站?都是新浪微博,也没有其他家了吧
你把想要的主页,数据截 ...
你的方法我修改之后出现解码错误 疾风怪盗 发表于 2020-10-28 22:08
不行?是什么意思?报错是什么?这类网站?都是新浪微博,也没有其他家了吧
你把想要的主页,数据截 ...
目标主页谁都行,比如李子柒这个视频下的所有评论,地址主页:https://m.weibo.cn/detail/4558599567448599,
我的方法还有你的方法只能抓取最前面一组20个评论,后面的没法抓取,如果你这个方法能抓,那请指导一下,我现在就是想抓取某个微博下的所有评论{:5_109:} 0zero0 发表于 2020-10-28 22:31
目标主页谁都行,比如李子柒这个视频下的所有评论,地址主页:https://m.weibo.cn/detail/45585995674485 ...
看到你的问题了。。。{:10_247:}放弃了,应该是新浪的反爬了,不用代码,把这个后面几页的地址在浏览器打开一下,第一下是能能看到数据,,刷新一下后,就没了,所以爬虫也没获取到数据,不知道是什么原理的话,没法爬吧
疾风怪盗 发表于 2020-10-28 22:48
看到你的问题了。。。放弃了,应该是新浪的反爬了,不用代码,把这个后面几页的地址在浏览器打 ...
是啊,我现在就卡在这里了,不知道现在怎么才能抓取所有评论,我这一套代码几年前还能用,现在不行了,感觉就差一步,特郁闷{:5_99:} 0zero0 发表于 2020-10-28 22:56
是啊,我现在就卡在这里了,不知道现在怎么才能抓取所有评论,我这一套代码几年前还能用,现在不行了,感 ...
那就是反爬升级了呗
我觉得应该尝试用selenium来试试,模拟登陆,再获取说不定就行了,不过要解决验证码问题 疾风怪盗 发表于 2020-10-28 23:06
那就是反爬升级了呗
我觉得应该尝试用selenium来试试,模拟登陆,再获取说不定就行了,不过要解决验证 ...
这也是一个方法 ,不过我没怎样研究过,看看有没有大佬指导一下在requests库下实现 自己顶,有没有大佬指导一下 requests实现不难,直接给你上代码吧。
import requests
import time
from lxml import etree
from requests.packages.urllib3.exceptions import InsecureRequestWarning
# 关闭ssl验证警告
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '
'(KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36',
# SUB这个参数是验证用户身份的,有效时间比较长,直接从浏览器cookie中复制过来就行
'cookie': 'SUB=_2AkMo_R8ef8NxqwJRmP4QyG7nbI5-zQDEieKeoe7FJRMxHRl-yT92qkATtRB6A30x8'
'w7ebx6OA37AgkBa_oyYo46SH9Px'
}
def get_weibo(page):
# 微博页
url = 'https://weibo.com/aj/v6/comment/big?'
params = {
'ajwvr': 6,# 固定值
'id': 4558599567448599,# 微博mid
'page': page,# 页码
'from': 'singleWeiBo',# 固定值
'__rnd': int(time.time() * 1000)# 时间戳
}
response = requests.get(url, headers=headers, params=params, verify=False)
# 得到一段包含评论的html代码
data = response.json()['data']['html']
html = etree.HTML(data)
items = html.xpath('//div[@class="list_box"]/div/div[@class="list_li S_line1 clearfix"]')
for item in items:
# 评论用户/内容/时间/点赞
name = item.xpath('string(div[@class="list_con"]/div/a)')
content = item.xpath('string(div[@class="list_con"]/div)').replace('¡评论配图', '').strip().split(':')
release_time = item.xpath('div/div[@class="WB_func clearfix"]/div/text()')
praise = item.xpath('div/div[@class="WB_func clearfix"]/div/ul/li/span/a/span/em/text()')
print('【{}】'.format(name), content, release_time, praise)
if __name__ == '__main__':
for i in range(1, 11):
get_weibo(i)
页:
[1]