【问题标题】:Why is Beautifulsoup Displaying Scrape URLs with Unnecessary Characters为什么 Beautifulsoup 显示带有不必要字符的抓取 URL
【发布时间】:2017-07-21 23:40:49
【问题描述】:

我尝试了其他类型的 css 选择器和 xpath,所以我假设我可能错误地使用了该库,但没有文档没有告诉我其他情况。我还尝试了其他 bs4 函数,例如 find_all,但很多都没有返回任何其他结果。任何类型的帮助都将不胜感激,干杯!

代码:

    import bs4 as bs
    from requests import get

    query = input('Please Enter Your Topic of intrest: ')

    first_part = query.replace(" ", "%20")
    second_part = query.replace(" ", "+")
    results= "0"

    num_of_pages = int(input('How many pages do you want scraped? '))

    for i in range(num_of_pages):
    results= int(results)
    results += 10

    gsearch_url = "https://www.google.com/search?q={}#q={}%3F&start={}&*".format(first_part, second_part, results)

    sauce = get(gsearch_url)

    soup = bs.BeautifulSoup(sauce.text, 'lxml')

    for url in soup.select('.r a'):
        print(url.get('href'))

返回:

    /url?q=http://www.codingdojo.com/blog/9-most-in-demand-programming-languages-of-2016/&sa=U&ved=0ahUKEwja3a21w7fSAhWSZiYKHdLGA9gQFggdMAI&usg=AFQjCNFmDl_1epVQRmDfc4y5MWFeNvrPQg
    /url?q=https://fossbytes.com/best-popular-programming-languages-2017/&sa=U&ved=0ahUKEwja3a21w7fSAhWSZiYKHdLGA9gQFgghMAM&usg=AFQjCNEKhYqx1FbKl_Wu-9EoMYd3e9i_Dw
    /url?q=http://www.bestprogramminglanguagefor.me/&sa=U&ved=0ahUKEwja3a21w7fSAhWSZiYKHdLGA9gQFggnMAQ&usg=AFQjCNHmbzuLwFo_egaWnbXSOW4p-Fva3g
    /url?q=http://www.codingdojo.com/blog/9-most-in-demand-programming-languages-of-2016/&sa=U&ved=0ahUKEwja3a21w7fSAhWSZiYKHdLGA9gQFggyMAU&usg=AFQjCNFmDl_1epVQRmDfc4y5MWFeNvrPQg
   etc....

【问题讨论】:

  • 我不明白你的问题,请说明你想要的回报(结果)并正确呈现你的代码。

标签: web-scraping beautifulsoup python-3.5 google-search


【解决方案1】:

首先,抓取 Google 的搜索结果违反了他们的服务条款。所以,在互联网的某个地方,伟大的 Alphabet 正在摇摆手指,皱起眉头。哦,是的,你可能也会在某个时候被验证码打耳光。

其次,咳咳纯粹是为了解决任何剩余的学术好奇心,你得到的结果不是由 BeautifulSoup 引起的。这实际上是谷歌正在回归的东西。您可以通过print(soup) 并仔细阅读 html 来检查它。您会注意到您的所有 href 与您打印的内容完全匹配。

为什么这看起来与您在浏览器中看到的不同? javascript的魔力! requests 库无法处理,因此您看到的结果没有经过所有客户端处理。

【讨论】:

    【解决方案2】:

    你正在寻找这个:

    # calls for ".yuRUbf a" css selector and grabs "href" attribute (link)
    soup.select_one('.yuRUbf a')['href']
    

    查看SelectorGadget Chrome 扩展程序,通过单击浏览器中所需的元素来获取CSS 选择器。 CSS 选择器reference.


    代码和example in the online IDE

    from bs4 import BeautifulSoup
    import requests, lxml
    
    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": "samurai cop what does katana mean",     # query
      "gl": "us",                                   # country to search from
      "hl": "en"                                    # language    
    }
    
    html = requests.get("https://www.google.com/search", headers=headers, params=params)
    soup = BeautifulSoup(html.text, 'lxml')
    
    for result in soup.select('.tF2Cxc'):
      title = result.select_one('.DKV0Md').text
      link = result.select_one('.yuRUbf a')['href']
      print(title, link, sep='\n')
    

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

    您的情况的不同之处在于,您只需要从结构化 JSON 中提取数据,而不是弄清楚为什么事情不起作用,然后在某些选择器发生变化时随着时间的推移对其进行维护。

    要集成的代码:

    import os
    from serpapi import GoogleSearch
    
    params = {
      "engine": "google",
      "q": "samurai cop what does katana mean",
      "hl": "en",
      "gl": "us",
      "api_key": os.getenv("API_KEY"),
    }
    
    search = GoogleSearch(params)
    results = search.get_dict()
    
    for result in results["organic_results"]:
      print(result['title'])
      print(result['link'])
    

    免责声明,我为 SerpApi 工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-19
      • 2019-09-25
      • 2013-09-20
      • 1970-01-01
      • 1970-01-01
      • 2022-12-03
      • 2019-09-17
      • 2019-09-25
      相关资源
      最近更新 更多