0zero0 发表于 2020-10-28 17:33:18

python爬虫求助,网页数据抓回来显示{"ok":0}

抓取微博评论数据,经过前期的一番操作,发现微博移动端数据格式比较清晰,比网页端好抓取,在浏览器端进入检查界面,模拟手机端访问,代码里设置了对应手机端的cookies,从图1可以看到我找到的评论数据在的地址,hotflow开头的地址,右边显示的是里面json格式的数据,图2是我通过代码抓回来的结果,现在存在这样一个问题,浏览器模拟移动端微博的界面刷新一下,可以得到图2的结果,数据能通过代码爬下来,但是再次运行代码会得到图3,网页状态是200,但是内容显示{"ok":0},没有其他数据,我现在只能手动刷新微博界面才能抓到数据,代码自己运行获取不到,隔一段时间运行也不行,既然手动刷新之后能够抓下来数据,那我的抓取地址和用户模拟登陆应该没问题吧,这是微博的反爬机制吗?请教论坛各位大佬,这个问题怎么解决?

均昊山 发表于 2020-10-28 18:35:43

代码粘出来

疾风怪盗 发表于 2020-10-28 18:41:20

这是我发的帖子,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))

0zero0 发表于 2020-10-28 21:37:53

疾风怪盗 发表于 2020-10-28 18:41
这是我发的帖子,https://fishc.com.cn/thread-179792-1-1.html
你的这个爬取评论和我这个是类似的,不需 ...

可能不是抓取得太频繁,因为隔了好几分钟之后抓取还是一样为空

0zero0 发表于 2020-10-28 21:47:51

均昊山 发表于 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)

疾风怪盗 发表于 2020-10-28 21:48:06

0zero0 发表于 2020-10-28 21:37
可能不是抓取得太频繁,因为隔了好几分钟之后抓取还是一样为空

但是我写的,没问题啊,试过好几次,一直能抓取,要么你试试看,没用到cookie

0zero0 发表于 2020-10-28 21:48:37

疾风怪盗 发表于 2020-10-28 21:48
但是我写的,没问题啊,试过好几次,一直能抓取,要么你试试看,没用到cookie

好的,我试下

0zero0 发表于 2020-10-28 21:56:37

疾风怪盗 发表于 2020-10-28 21:48
但是我写的,没问题啊,试过好几次,一直能抓取,要么你试试看,没用到cookie

我用你这个方法试了下我要抓取的网页发现不行,你要是有空帮忙试下我这类网址,
https://m.weibo.cn/comments/hotflow?id=4558599567448599&mid=4558599567448599&max_id=167296692120734&max_id_type=0

疾风怪盗 发表于 2020-10-28 22:08:08

0zero0 发表于 2020-10-28 21:56
我用你这个方法试了下我要抓取的网页发现不行,你要是有空帮忙试下我这类网址,
https://m.weibo.cn/com ...

不行?是什么意思?报错是什么?这类网站?都是新浪微博,也没有其他家了吧

你把想要的主页,数据截图贴出来

0zero0 发表于 2020-10-28 22:14:42

疾风怪盗 发表于 2020-10-28 22:08
不行?是什么意思?报错是什么?这类网站?都是新浪微博,也没有其他家了吧

你把想要的主页,数据截 ...

好的,稍等

0zero0 发表于 2020-10-28 22:23:14

疾风怪盗 发表于 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,我现在想抓取的就是这个页面里的数据。

0zero0 发表于 2020-10-28 22:27:36

疾风怪盗 发表于 2020-10-28 22:08
不行?是什么意思?报错是什么?这类网站?都是新浪微博,也没有其他家了吧

你把想要的主页,数据截 ...

你的方法我修改之后出现解码错误

0zero0 发表于 2020-10-28 22:31:32

疾风怪盗 发表于 2020-10-28 22:08
不行?是什么意思?报错是什么?这类网站?都是新浪微博,也没有其他家了吧

你把想要的主页,数据截 ...

目标主页谁都行,比如李子柒这个视频下的所有评论,地址主页:https://m.weibo.cn/detail/4558599567448599,
我的方法还有你的方法只能抓取最前面一组20个评论,后面的没法抓取,如果你这个方法能抓,那请指导一下,我现在就是想抓取某个微博下的所有评论{:5_109:}

疾风怪盗 发表于 2020-10-28 22:48:25

0zero0 发表于 2020-10-28 22:31
目标主页谁都行,比如李子柒这个视频下的所有评论,地址主页:https://m.weibo.cn/detail/45585995674485 ...

看到你的问题了。。。{:10_247:}放弃了,应该是新浪的反爬了,不用代码,把这个后面几页的地址在浏览器打开一下,第一下是能能看到数据,,刷新一下后,就没了,所以爬虫也没获取到数据,不知道是什么原理的话,没法爬吧

0zero0 发表于 2020-10-28 22:56:51

疾风怪盗 发表于 2020-10-28 22:48
看到你的问题了。。。放弃了,应该是新浪的反爬了,不用代码,把这个后面几页的地址在浏览器打 ...

是啊,我现在就卡在这里了,不知道现在怎么才能抓取所有评论,我这一套代码几年前还能用,现在不行了,感觉就差一步,特郁闷{:5_99:}

疾风怪盗 发表于 2020-10-28 23:06:44

0zero0 发表于 2020-10-28 22:56
是啊,我现在就卡在这里了,不知道现在怎么才能抓取所有评论,我这一套代码几年前还能用,现在不行了,感 ...

那就是反爬升级了呗

我觉得应该尝试用selenium来试试,模拟登陆,再获取说不定就行了,不过要解决验证码问题

0zero0 发表于 2020-10-29 08:13:17

疾风怪盗 发表于 2020-10-28 23:06
那就是反爬升级了呗

我觉得应该尝试用selenium来试试,模拟登陆,再获取说不定就行了,不过要解决验证 ...

这也是一个方法 ,不过我没怎样研究过,看看有没有大佬指导一下在requests库下实现

0zero0 发表于 2020-10-29 15:16:32

自己顶,有没有大佬指导一下

YunGuo 发表于 2020-11-5 16:34:55

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]
查看完整版本: python爬虫求助,网页数据抓回来显示{"ok":0}