【问题标题】:Python requests like a browser?像浏览器一样的 Python 请求?
【发布时间】: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 上浪费性能。

【问题讨论】:

    标签: python web-scraping cookies python-requests


    【解决方案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。但是,你还是帮了我很大的忙!赞成您的评论,但要在这里真正做到这一点。
    猜你喜欢
    • 2017-05-12
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多