孤霜情冷点朱砂 发表于 2023-7-10 19:08

爬取脉脉网数据

本帖最后由 孤霜情冷点朱砂 于 2023-7-10 19:18 编辑


URL:https://maimai.cn/

技术需求:1.需要登录才能访问,使用人工登陆+获取cookie的方式绕过登录
               2.需要Ajax进行异步访问
               3.通过抓包获取结果


代码如下:
import requests
import json

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",
    "Cookie": "", #填入自己的cookie
    "X-Csrf-Token": "12136vux-ycWY72FoKjbUsFfLYfqgVBQoRlA",
}
# https://maimai.cn/sdk/web/content/get_list?api=gossip%2Fv3%2Fsquare&u=239689746&page=2&before_id=0
# ?后面的数据不需要复制,那是载荷中提供的参数

url = "https://maimai.cn/sdk/web/content/get_list"

def crawl_page(num):
    param = {
      "api": "gossip/v3/square",
      "u": "239689746",
      "page": f"{num}",
      "before_id": "0"
    }
    r = requests.get(url, headers=headers, params=param)
    data = json.loads(r.text)
    datas = []
    for text in data["list"]:
      # print(text['text'])
      datas.append(text["text"])
    return datas

with open("脉脉结果.txt","w",encoding="utf8")as f:
    for page in range(11):
      print("craw page %s"%page)
      datas = crawl_page(page)
      f.write("\n".join(datas)+"\n")

需要注意的点:
1.headers中的数据需要根据经验来设置,实在不行可以将请求标头的所有内容写入进去。
2.爬取的网页是通过Ajax异步加载的,所以爬取的网页需要自己F12查看。
3.网址?后面的数据不需要复制,那是载荷中提供的参数。requests.get(url, headers=headers, params=param)
4.得到的json结果需要使用json.loads()解析为python对象。

jidesheng6 发表于 2023-7-10 20:31

headers中的参数,一般类似token这种是一定要写的,但是这个token来源可能是在前端页面中的某个标签中隐藏的,每次刷新都是新的token

host参数也是概率很大的一个参数,有些网站会有host头验证,这个一般是漏洞扫描要求的,会用来预防host头注入

一个概率比较低的就是accept头,某些网站会用form表单来传递数据,但是你看payload是json的,如果傻乎乎传了json,没改accept头就会被拒绝,这个概率很低很低,20%左右的概率


requests中已经有json模块了,你不需要重新load,除非返回的文本有问题,需要你重新处理成正确的json字符串再load,这时候就用json模块,如果requests回来数据正常,拿到respone对象以后,直接用.json方法就可以解析了。

Sandwiches 发表于 2023-7-10 20:04

都是一些比较简单的爬虫,想学点深奥一点的,例如逆向,手机端

yizhimei123 发表于 2023-7-10 21:19

学了点爬虫,基本能看懂!

wsxb 发表于 2023-7-10 23:38

怎么弄LY的

echoaku 发表于 2023-7-11 09:13

厉害,感谢分享

孤霜情冷点朱砂 发表于 2023-7-11 10:36

jidesheng6 发表于 2023-7-10 20:31
headers中的参数,一般类似token这种是一定要写的,但是这个token来源可能是在前端页面中的某个标签中隐藏 ...

感谢大佬~,但是不用json.loads(),获取到的r.text是一个字符串对象,不方便遍历。所以改为json对象的。

jidesheng6 发表于 2023-7-11 10:43

孤霜情冷点朱砂 发表于 2023-7-11 10:36
感谢大佬~,但是不用json.loads(),获取到的r.text是一个字符串对象,不方便遍历。所以改为json对象的。

r.text就是普通文本,可以直接用r.json()来试试,如果你从结构上看属于json就直接用,这一步相当于requests帮你执行了import json;json.loads(r.text),只是简化一点,你的写法也是可以的。

孤霜情冷点朱砂 发表于 2023-7-11 11:09

jidesheng6 发表于 2023-7-11 10:43
r.text就是普通文本,可以直接用r.json()来试试,如果你从结构上看属于json就直接用,这一步相当于reques ...

是的是的,感谢感谢~

O2H2O 发表于 2023-7-12 08:51

还不会用Ajax……
页: [1] 2
查看完整版本: 爬取脉脉网数据