没有输出到所需链接的抓取页面
scraping page with no output to desired links
我想抓取这个网页:
http://protected.to/f-42cbf8ce2521d615
但我必须单击“继续文件夹”才能访问这些链接。我在 HTML 源中看不到这些链接,只有当我实际使用鼠标单击“继续文件夹”按钮时才会看到这些链接。
如何避免通过物理点击访问网站中的这些链接?
我是网络抓取的新手,所以请帮我解决这个问题。
感谢您的关注和时间。
奥祖哈
import requests
from bs4 import BeautifulSoup
s = requests.Session()
url='http://protected.to/f-c9036f7a236b1511'
r = s.get(url)
soup = BeautifulSoup(r.text, features="html.parser")
params = {i['name']:i.get('value') for i in soup.find('div', {'class':'col-md-12 text-center'}).find_all('input')}
headers = {"Host": "protected.to",
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:99.0) Gecko/20100101 Firefox/99.0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.5",
"Accept-Encoding": "gzip, deflate",
"Connection":"keep-alive",
"Cookie": r.headers['Set-Cookie'],
"Upgrade-Insecure-Requests": "1",
"Sec-GPC": "1",
"DNT": "1"}
print(params)
r_ = s.post(url, headers = headers, cookies = r.cookies, params=params)
print(r_.status_code)
“继续到文件夹”是表单的提交按钮,POST将“__RequestVerificationToken”值和 slug 标记添加到页面以显示文件夹的内容。
因此,理论上 - 您必须解析 http://protected.to/f-42cbf8ce2521d615 中的 HTML 以提取隐藏字段“__RequestVerificationToken”的值,即保存该标记值的输入名称;要获取您需要在标签之间查看的 slug 令牌,您会看到它在加载页面时动态创建了一个 slug 令牌;
一旦你得到那个值,你就必须用令牌和 slug 做一个 POST 到相同的 URL http://protected.to/f-42cbf8ce2521d615,正文的内容会看起来像像这样:__RequestVerificationToken=8BYeNPftVEEivO2imhtWIuWAb0mjhPg-5pAhq1mlpL_pTyYR1AyScbfqB8QZDudwGY_1LkV79FCDgpyffRPuktApd2ZQYBdi2ySA5ATUZ601&鼻涕虫=42cbf8ce2521d615
以上将 return 包含文件夹内容的页面;您可以通过简单地打开开发工具并检查点击 'Continue to Folder' 时发生的情况来复制我上面所说的内容,您可以看到 POST 由内容以及包含项目的页面元素组成需要进行 POST 调用(验证令牌和 slug 令牌)。
您可以使用为表现得像用户 selenium 而编写的复杂库。但我会去简单的 .click()
到按钮然后解析 HTML.
const button = document.querySelector('[value="Continue to folder"]');
button.click();
// Parse the HTML
我想抓取这个网页:
http://protected.to/f-42cbf8ce2521d615
但我必须单击“继续文件夹”才能访问这些链接。我在 HTML 源中看不到这些链接,只有当我实际使用鼠标单击“继续文件夹”按钮时才会看到这些链接。
如何避免通过物理点击访问网站中的这些链接?
我是网络抓取的新手,所以请帮我解决这个问题。
感谢您的关注和时间。
奥祖哈
import requests
from bs4 import BeautifulSoup
s = requests.Session()
url='http://protected.to/f-c9036f7a236b1511'
r = s.get(url)
soup = BeautifulSoup(r.text, features="html.parser")
params = {i['name']:i.get('value') for i in soup.find('div', {'class':'col-md-12 text-center'}).find_all('input')}
headers = {"Host": "protected.to",
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:99.0) Gecko/20100101 Firefox/99.0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.5",
"Accept-Encoding": "gzip, deflate",
"Connection":"keep-alive",
"Cookie": r.headers['Set-Cookie'],
"Upgrade-Insecure-Requests": "1",
"Sec-GPC": "1",
"DNT": "1"}
print(params)
r_ = s.post(url, headers = headers, cookies = r.cookies, params=params)
print(r_.status_code)
“继续到文件夹”是表单的提交按钮,POST将“__RequestVerificationToken”值和 slug 标记添加到页面以显示文件夹的内容。
因此,理论上 - 您必须解析 http://protected.to/f-42cbf8ce2521d615 中的 HTML 以提取隐藏字段“__RequestVerificationToken”的值,即保存该标记值的输入名称;要获取您需要在标签之间查看的 slug 令牌,您会看到它在加载页面时动态创建了一个 slug 令牌;
一旦你得到那个值,你就必须用令牌和 slug 做一个 POST 到相同的 URL http://protected.to/f-42cbf8ce2521d615,正文的内容会看起来像像这样:__RequestVerificationToken=8BYeNPftVEEivO2imhtWIuWAb0mjhPg-5pAhq1mlpL_pTyYR1AyScbfqB8QZDudwGY_1LkV79FCDgpyffRPuktApd2ZQYBdi2ySA5ATUZ601&鼻涕虫=42cbf8ce2521d615
以上将 return 包含文件夹内容的页面;您可以通过简单地打开开发工具并检查点击 'Continue to Folder' 时发生的情况来复制我上面所说的内容,您可以看到 POST 由内容以及包含项目的页面元素组成需要进行 POST 调用(验证令牌和 slug 令牌)。
您可以使用为表现得像用户 selenium 而编写的复杂库。但我会去简单的 .click()
到按钮然后解析 HTML.
const button = document.querySelector('[value="Continue to folder"]');
button.click();
// Parse the HTML