我无法使用请求登录instagram

2024-04-27 03:21:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我发现这个 但是代码

import re
import requests
from bs4 import BeautifulSoup

from datetime import datetime

link = 'https://www.instagram.com/accounts/login/'
login_url = 'https://www.instagram.com/accounts/login/ajax/'

time = int(datetime.now().timestamp())

payload = {
    'username': 'login',
    'enc_password': f'#PWD_INSTAGRAM_BROWSER:0:{time}:your_password',
    'queryParams': {},
    'optIntoOneTap': 'false'
}

with requests.Session() as s:
    r = s.get(link)
    csrf = re.findall(r"csrf_token\":\"(.*?)\"", r.text)[0]
    r = s.post(login_url, data=payload, headers={
        "User-Agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36",
        "X-Requested-With": "XMLHttpRequest",
        "Referer": "https://www.instagram.com/accounts/login/",
        "x-csrftoken": csrf
    })
    print(r.status_code)

给我csrftoken的错误

      line 21, in <module>
    csrf = re.findall(r"csrf_token\":\"(.*?)\"", r.text)[0]
IndexError: list index out of range

其他关于堆栈溢出的帖子对我不起作用

我不想用硒


Tags: fromhttpsimportrecomurldatetimetime
1条回答
网友
1楼 · 发布于 2024-04-27 03:21:37

TL;博士

在第20行的get请求头中添加user-agent

r = s.get(link, headers={'User-Agent': 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_7_3 rv:3.0; sl-SI) AppleWebKit/533.38.2 (KHTML, like Gecko) Version/5.0 Safari/533.38.2'})

长话短说

如果我们查看您发布的错误消息,我们可以开始剖析出了什么问题。第21行试图在instagram login page上查找csrf_标记属性

诊断学

我们可以从错误消息中看到列表索引超出范围,在本例中,这意味着re.findalldocs)返回的列表为空。这意味着

  1. 你的正则表达式错了
  2. 第20行上的get请求(docsr = s.get(link)返回的html不包含csrf\u标记属性
  3. 该属性在源html中不存在

如果我们访问该页面并查看其html源代码,我们可以看到第261行上确实存在csrf_标记属性:

&13; 第13部分,;
<script type="text/javascript">window._sharedData = {"config":{"csrf_token":"TOKEN HERE","viewer":null,"viewerId":null}}</script>
和#13;
和#13;

注意,为了简洁起见,我排除了代码中的其余部分

现在我们知道它出现在页面上,我们可以将通过get请求接收到的已删除的html写入本地文件并进行检查:

r = s.get(link)
with open("csrf.html", "w") as f:
   f.write(html)

如果打开该文件并对csrf\u令牌执行Ctrl+f,则该文件不存在。这可能意味着Instagram检测到您正在通过刮板访问该页面,并返回了该页面的修改版本

修复

为了解决此问题,您需要向请求标头添加一个用户代理,该代理实质上是“欺骗”页面,使其认为您正在通过浏览器访问该页面,这可以通过更改以下内容来实现:

r = s.get(link)

对这样的事情:

r = s.get(link, headers={'User-Agent': 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_7_3 rv:3.0; sl-SI) AppleWebKit/533.38.2 (KHTML, like Gecko) Version/5.0 Safari/533.38.2'})

注意,这是来自here的随机用户代理


注释

我很感激您不想在任务中使用selenium,但您可能会发现,您想要进行的动态交互越多,就越难通过请求模块之类的静态刮取库来实现。以下是一些在python中学习selenium的好资源:

Selenium docs

Python Selenium Tutorial #1 - Web Scraping, Bots & Testing

相关问题 更多 >