【问题标题】:why is nothing getting parsed in my web scraping program?为什么我的网络抓取程序没有解析任何内容?
【发布时间】:2020-09-23 15:38:44
【问题描述】:

我制作了这段代码来搜索谷歌搜索中的所有顶级链接。但它没有返回。

import webbrowser, requests
from bs4 import BeautifulSoup
string = 'selena+gomez'
website = f'http://google.com/search?q={string}'
req_web = requests.get(website).text
parser = BeautifulSoup(req_web, 'html.parser')
gotolink = parser.find('div', class_='r').a["href"]
print(gotolink)

【问题讨论】:

    标签: web-scraping beautifulsoup python-requests python-webbrowser


    【解决方案1】:

    Google 需要您指定 User-Agent http 标头才能返回正确的页面。如果未指定正确的 User-Agent,Google 会返回不包含 <div> 标记的页面,并带有 r 类。你可以在使用print(soup) 和不使用User-Agent 时看到它。

    例如:

    import requests
    from bs4 import BeautifulSoup
    
    string = 'selena+gomez'
    headers = {'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:76.0) Gecko/20100101 Firefox/76.0'}
    website = f'http://google.com/search?hl=en&q={string}'
    
    req_web = requests.get(website, headers=headers).text
    parser = BeautifulSoup(req_web, 'html.parser')
    gotolink = parser.find('div', class_='r').a["href"]
    print(gotolink)
    

    打印:

    https://www.instagram.com/selenagomez/?hl=en
    

    【讨论】:

    • 这对我很有帮助。你能补充一句关于这是如何解决问题的吗?
    • @andrewjames 我添加了一些解释。归根结底,没有User-Agent Goggle 会返回您在浏览器中看到的其他 HTML 版本。
    • @AndrejKesely 非常感谢兄弟!!!!这解决了我的问题...
    【解决方案2】:

    Andrej Kesely 的回答将引发错误,因为此 css 类不再存在:

    gotolink = parser.find('div', class_='r').a["href"]
    AttributeError: 'NoneType' object has no attribute 'a'
    

    详细了解user-agentrequest headers

    基本上user-agent 让我们识别浏览器、它的版本号和它的主机操作系统,在 Web 上下文中代表一个人(浏览器),让服务器和网络对等方识别它是否是机器人与否。

    在这种情况下,您需要发送一个虚假的 user-agent,以便 Google 将您的请求视为“真实”用户访问 also known as user-agent spoofing

    在请求headers 中传递user-agent

    headers = {
        'User-agent':
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
    }
    
    requests.get(YOUR_URL, headers=headers)
    

    代码和example in the online IDE

    from bs4 import BeautifulSoup
    import requests
    
    headers = {
        'User-agent':
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
    }
    
    params = {
      "q": "selena gomez"
    }
    
    html = requests.get('https://www.google.com/search', headers=headers, params=params)
    soup = BeautifulSoup(html.text, 'lxml')
    
    link = result.select_one('.yuRUbf a')['href']
    print(link)
    
    # https://www.instagram.com/selenagomez/
    

    或者,您可以使用来自 SerpApi 的 Google Organic Results API 来实现相同的目的。这是一个带有免费计划的付费 API。

    本质上,您的情况的主要区别在于,您无需考虑如何绕过 Google 块(如果它们出现)或弄清楚如何抓取更难抓取的元素,因为它已经完成了-用户。唯一需要做的就是从 JSON 字符串中获取你想要的数据。

    示例代码:

    import os
    from serpapi import GoogleSearch
    
    params = {
        "engine": "google",
        "q": "selena gomez",
        "api_key": os.getenv("API_KEY"),
    }
    
    search = GoogleSearch(params)
    results = search.get_dict()
    
    # [0] means index of the first organic result 
    link = results['organic_results'][0]['link']
    print(link)
    
    # https://www.instagram.com/selenagomez/
    

    免责声明,我为 SerpApi 工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-20
      • 1970-01-01
      • 2018-07-09
      • 1970-01-01
      • 2021-12-31
      • 2017-03-24
      • 2019-09-09
      相关资源
      最近更新 更多