我发现这个 但是代码
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
其他关于堆栈溢出的帖子对我不起作用
我不想用硒
TL;博士
在第20行的get请求头中添加user-agent:
长话短说
如果我们查看您发布的错误消息,我们可以开始剖析出了什么问题。第21行试图在instagram login page上查找csrf_标记属性
诊断学
我们可以从错误消息中看到列表索引超出范围,在本例中,这意味着
re.findall
(docs)返回的列表为空。这意味着r = s.get(link)
返回的html不包含csrf\u标记属性如果我们访问该页面并查看其html源代码,我们可以看到第261行上确实存在csrf_标记属性:
注意,为了简洁起见,我排除了代码中的其余部分
现在我们知道它出现在页面上,我们可以将通过get请求接收到的已删除的html写入本地文件并进行检查:
如果打开该文件并对csrf\u令牌执行Ctrl+f,则该文件不存在。这可能意味着Instagram检测到您正在通过刮板访问该页面,并返回了该页面的修改版本
修复
为了解决此问题,您需要向请求标头添加一个用户代理,该代理实质上是“欺骗”页面,使其认为您正在通过浏览器访问该页面,这可以通过更改以下内容来实现:
对这样的事情:
注意,这是来自here的随机用户代理
注释
我很感激您不想在任务中使用selenium,但您可能会发现,您想要进行的动态交互越多,就越难通过请求模块之类的静态刮取库来实现。以下是一些在python中学习selenium的好资源:
Selenium docs
Python Selenium Tutorial #1 - Web Scraping, Bots & Testing