像浏览器一样的 Python 请求?
Posted
技术标签:
【中文标题】像浏览器一样的 Python 请求?【英文标题】:Python requests like a browser? 【发布时间】:2021-04-14 00:07:54 【问题描述】:我想从“https://www.fanfiction.net/s/5218118/1/”获取一个网络文档,但遗憾的是我无法复制浏览器的行为 - 服务器总是向我发送一些内容“请启用 cookie”或“完成验证码”行。有没有办法像浏览器一样发送请求,所以服务器会像我是浏览器一样向我提供相同的文档?我已经用谷歌搜索并尝试集成 cookie 和假用户代理。这是我的代码:
import requests
from fake_useragent import UserAgent
url = 'https://www.fanfiction.net/s/5218118/1/'
ua = UserAgent()
S = requests.Session()
header = 'User-Agent':str(ua.chrome)
res = S.get(url, headers=header)
cookies = dict(res.cookies)
response = S.get(url, headers=header, cookies=cookies)
提前致谢! 编辑:我知道我可以使用 selenium,但我不想总是更新我的 chromedriver,也不想在 selenium 上浪费性能。
【问题讨论】:
【参考方案1】:看到你的编辑,但以防万一,...
使用 selenium 的简单示例,为您提供 storytext
from selenium import webdriver
from bs4 import BeautifulSoup
browser = webdriver.Chrome('C:\Program Files\ChromeDriver\chromedriver.exe')
browser.get('https://www.fanfiction.net/s/5218118/1/')
soup=BeautifulSoup(browser.page_source, 'lxml')
print(soup.select_one('#storytext').get_text())
browser.close()
编辑
根据您的问题以及网站受到 cloudflare 保护以避免 ddos 攻击的事实进行编辑。
您可以通过 selenium 提取标签文本,但如上例所示,我使用 beautifulsoup
你是对的,用开发者工具检查html
,标签部分是这样的:
<span class="xgray xcontrast_txt">
Rated: <a class="xcontrast_txt" href="https://www.fictionratings.com/" target="rating">Fiction T</a> - English - Romance/Adventure - Naruto U., Hinata H. - Chapters: 6 - Words: 14,894 - Reviews: <a href="/r/13747729/">5</a>
- Favs: 29 - Follows: 24 - Updated:
<span data-xutime="1610096566">33m ago</span>
- Published:
<span data-xutime="1605552788">Nov 16, 2020</span>
- id: 13747729
</span>
带有xgray xcontrast_txt
类的span
,所以我们这样选择它:
tags = soup.select_one('span.xgray.xcontrast_txt').get_text(strip=True)
You may wanna know more about beautifulsoup?
示例
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
browser = webdriver.Chrome('C:\Program Files\ChromeDriver\chromedriver.exe')
browser.get('https://www.fanfiction.net/s/5218118/4/Yet-again-with-a-little-extra-help')
try:
# wait until certain element with id 'storytext' showed up
element = WebDriverWait(browser, 10).until(
EC.presence_of_element_located((By.ID, 'storytext'))
)
soup=BeautifulSoup(browser.page_source, 'lxml')
storytext = soup.select_one('#storytext').get_text()
tags = soup.select_one('span.xgray.xcontrast_txt').get_text(strip=True)
print(tags)
print(storytext)
finally:
browser.close()
【讨论】:
谢谢,这是一个很好的 sn-p - 如果没有更好的解决方案,我将不得不使用它。 如果我可以为此添加一个新问题 - 我对硒很陌生。您是如何找到“#storytext”关键字来选择文本的?我需要什么来获取包含统计信息的网站部分(上次更新、多少章等)?你是怎么找到这些#tags的?我试过chrome的开发者工具... 我更新了关于标签问题的答案 - 将来创建一个新问题并参考您的旧问题可能会更好。乐于助人,欢迎来到 Stack Overflow。如果此答案或任何其他答案解决了您的问题,请将其标记为已接受 - someone-answers - 谢谢 谢谢。我现在要提出一个新问题,关于 cloudflare 和 selenium。但是,你还是帮了我很大的忙!赞成您的评论,但要在这里真正做到这一点。以上是关于像浏览器一样的 Python 请求?的主要内容,如果未能解决你的问题,请参考以下文章
鼠标上下滑动网页上的内容像波浪一样翻滚是神马原因导致的?我想要调回网页随着鼠标静静的流动,请求各位