【问题标题】:Crawling google search url list with python用python抓取谷歌搜索url列表
【发布时间】:2018-08-29 03:44:48
【问题描述】:

我想用 python 抓取 google 搜索结果的 url。

这是我的代码

import requests
from bs4 import BeautifulSoup

def search(keyword):        
    html = requests.get('https://www.google.co.kr/search?q={}&num=100&sourceid=chrome&ie=UTF-8'.format(keyword)).text
    soup = BeautifulSoup(html, 'html.parser')
    result = []
    for i in soup.find_all('h3', {'class':'r'}):
        result.append(i.find('a', href = True) ['href'][7:])
    return result

search('computer')

然后我可以得到结果。列表的第一个 url 是 wikipedia.com,即,

'https://en.wikipedia.org/wiki/Computer&sa=U&ved=0ahUKEwixyfu7q5HdAhWR3lQKHUfoDcsQFggTMAA&usg=AOvVaw2nvT-2sO4iJenW_fkyCS3i', '?q=computer&num=100&ie=UTF-8&prmd=ivnsbp&tbm=isch&tbo=u&source=univ&sa=X&ved=0ahUKEwixyfu7q5HdAhWR3lQKHUfoDcsQsAQIHg'

我想获得干净的 url,即“https://en.wikipedia.org/wiki/Computer”,在这种情况下包括所有其他搜索结果。

如何修改我的代码?

已编辑:如下图所示,我要的是真正的 url(标记为黄色),而不是上面那个乱七八糟的 url。

【问题讨论】:

    标签: python web web-crawler


    【解决方案1】:

    追加怎么样

    .split('&')[0]
    

    到您的代码中,使其变为:

    import requests
    from bs4 import BeautifulSoup
    
    def search(keyword):
        html = requests.get('https://www.google.co.kr/search?q={}&num=100&sourceid=chrome&ie=UTF-8'.format(keyword)).text
        soup = BeautifulSoup(html, 'html.parser')
        result = []
        for i in soup.find_all('h3', {'class':'r'}):
            result.append(i.find('a', href = True) ['href'][7:].split('&')[0])
        return result
    
    search('computer')
    

    [编辑]

    https://en.wikipedia.org/wiki/Computer为例:

    通过 chrome 开发者工具,url 看起来很干净。

    由于它属于<h3 class="r">,因此您的代码应该可以正常工作并返回干净的网址。

    相反,如果你替换

    result.append(i.find('a', href = True) ['href'][7:])
    

    print i
    

    然后在我的终端中,它为上述链接返回以下内容:

    /url?q=https://en.wikipedia.org/wiki/Computer&sa=U&ved=0ahUKEwinqcqdypHdAhVhKH0KHVWIBEUQFggfMAU&usg=AOvVaw1pduIWw_TSCJUxtP9W_kHJ
    

    你可以看到/url?q=已经被添加了,&sa=U&ved=0ahUKEwinqcqdypHdAhVhKH0KHVWIBEUQFggfMAU&usg=AOvVaw1pduIWw_TSCJUxtP9W_kHJ 被添加了。

    通过查看其他链接,我发现前置部分总是看起来像 /url?q=,而附加部分总是以 & 开头。

    因此,我相信我的原始答案应该有效:

    result.append(i.find('a', href = True) ['href'][7:].split('&')[0])
    

    [7:] 删除附加字符串,split('&')[0] 删除附加字符串。

    【讨论】:

    • 这只适用于他放弃的一个链接。如果存在不包含 & 符号的链接,它将崩溃。
    • @JosephSeungJaeDollar 对,我需要将通用方法应用于收集的每个网址。
    • @JosephSeungJaeDollar 我很确定它不会崩溃,如果链接不包含 & 符号,它将保持原样。
    • @WookeunLee + 链接通常由&? 设置为“不干净”,因此您可以继续添加相应的条件(例如.split('?')[0]),直到获得您想要的结果。我的结果看起来很好,但单独使用 & 符号。
    • @wookiekim 我修改了我的问题,再次查看。
    【解决方案2】:

    我找到了解决办法。

    搜索功能中的这种修改有效。

    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36'}     
        html = requests.get('https://www.google.co.kr/search?q={}&num=100&sourceid=chrome&ie=UTF-8'.format(keyword), headers = headers).text
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 2020-05-03
      • 2018-01-15
      • 1970-01-01
      • 2020-10-09
      相关资源
      最近更新 更多