对于Python抓取Google搜索结果的一些了解

本文涉及的产品
.cn 域名,1个 12个月
简介: 对于Python抓取Google搜索结果的一些了解

1.问题


目前主流的搜索引擎,非 google莫属,但其对于非法(流量异常、爬虫)请求的封锁也是异常严厉


本人前段时间有个脚本用到了谷歌搜索,具体见Python之由公司名推算出公司官网(余弦相似度)当时直接使用的是一个 python开源项目


但在使用过程中,单 ip的情况下爬取速度可谓感人,稍不留神还会被封,所以对于获取谷歌搜索结果的爬虫有必要进行改进


说一说爬取谷歌搜索结果的问题:


  • 1.正常打开谷歌搜索,然后审查元素想获取目标内容的时候,会发现是一大串js。

  • 2.访问过快就会出现流量异常

2.如何解决


对于第一个问题:

1.jpg

应该有看到审查元素出来的都是js,然后检索的url是这样的:


https://www.google.com.hk/search?q=hello&oq=hello&aqs=chrome..69i57j69i60l2j69i65j69i60j0.876j0j7&sourceid=chrome&ie=UTF-8&google_abuse=GOOGLE_ABUSE_EXEMPTION%3DID%3Daa946d8c657cf359:TM%3D1484917472:C%3Dr:IP%3D118.193.241.44-:S%3DAPGng0tGiKFaIr7YCaivUEmmEHOYJhG4jg%3B+path%3D/%3B+domain%3Dgoogle.com%3B+expires%3DFri,+20-Jan-2017+16:04:32+GMT


这里解决办法很粗暴,禁止掉js就好,让我们看看禁止js后是什么样的:

2.jpg

然后再看url: https://www.google.com.hk/search?q=hello&btnG=Search&safe=active&gbv=1


对于这个 url,相信机智的你应该会明白些什么


这里可以写个简单的脚本,比如说获取,谷歌搜索第一页所有结果的 html,简单写下:

 URL_SEARCH = "https://{domain}/search?hl={language}&q={query}&btnG=Search&gbv=1"
   URL_NUM = "https://{domain}/search?hl={language}&q={query}&btnG=Search&gbv=1&num={num}"
   def search_page(query, language='en', num=None, start=0, pause=2):
       """
       Google search
       :param query: Keyword
       :param language: Language
       :return: result
       """
       time.sleep(pause)
       domain = self.get_random_domain()
       if num is None:
           url = URL_SEARCH
           url = url.format(
               domain=domain, language=language, query=quote_plus(query))
       else:
           url = URL_NUM
           url = url.format(
               domain=domain, language=language, query=quote_plus(query), num=num)
       try:
           requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
           r = requests.get(url=url,
                            allow_redirects=False,
                            verify=False,
                            timeout=30)
           charset = chardet.detect(r.content)
           content = r.content.decode(charset['encoding'])
           return content
       except Exception as e:
           logging.error(e)
           return None

到了这里,问题才刚开始,你可以做个实验,我假设你是使用代理进行谷歌搜索,如果你连续不断无间隔使用谷歌搜索某一关键字二三十下,不出意外你会被要求进行这样的验证:


3.jpg

这个问题可真是让人十分厌恶,我并没有很好的解决办法,能做的唯有尽量避免:


1.ip轮询 2.每次结果爬取增加休眠 3.随机user_agent是必备


第一点和第三点不必多说,对于第二点增加休眠时间则需要我们好好地进行检测。 假设在单ip随机ua情况下:


  • 1.这种情况下不休眠的话请求个两三次就会直接被封(第二天会被解封)

  • 2.个人觉得这不是个解决办法,因为对休眠时间把控不好的话就会造成封ip,如果不想被封,我测试的话需要休眠60s浮动,这没什么意义

  • 3.而且这种情况下发现是直接封ip,对开发者太不友好

对于这种情况,受同事神来一句,发现一个暂时的解决办法,请看下图:

4.jpg

单一ip不停地访问统一谷歌域名自然很容易被察觉,谷歌全球190+的域名,难道都在实时的统计ip么,可能有,但绝对不会像单域名那样严格,来做个测试。


我将全球190+谷歌域名集中起来,像ua一样随机轮换,然后进行测试(单ip),结果还不错:


  • 1.首先没有出现被封ip,只会提示流量异常

  • 2.还是需要休眠,本人休眠5~15s没有被封过,可根据自身情况来,如果想稳妥点就5~30s吧

我将这些写成了一个项目,magic_google-python,若你是phper,可以看看我写的php版本php-google,具体代码可以看这里,对应的功能很简单:

from magic_google import MagicGoogle
import pprint
# Or PROXIES = None
PROXIES = [{
   'http': 'http://192.168.2.207:1080',
   'https': 'http://192.168.2.207:1080'
}]
# Or MagicGoogle()
mg = MagicGoogle(PROXIES)
#  Crawling the whole page
result = mg.search_page(query='python')
# Crawling url
for url in mg.search_url(query='python'):
   pprint.pprint(url)
# Output
# 'https://www.python.org/'
# 'https://www.python.org/downloads/'
# 'https://www.python.org/about/gettingstarted/'
# 'https://docs.python.org/2/tutorial/'
# 'https://docs.python.org/'
# 'https://en.wikipedia.org/wiki/Python_(programming_language)'
# 'https://www.codecademy.com/courses/introduction-to-python-6WeG3/0?curriculum_id=4f89dab3d788890003000096'
# 'https://www.codecademy.com/learn/python'
# 'https://developers.google.com/edu/python/'
# 'https://learnpythonthehardway.org/book/'
# 'https://www.continuum.io/downloads'
# Get {'title','url','text'}
for i in mg.search(query='python', num=1):
   pprint.pprint(i)
# Output
# {'text': 'The official home of the Python Programming Language.',
# 'title': 'Welcome to Python .org',
# 'url': 'https://www.python.org/'}

3.总结


对google搜索结果的提取,有以下建议:


  • 1.ip轮询

  • 2.ua随机

  • 3.domain随机

  • 4.休眠

源码已开源在GitHub,有兴趣可查看源码:https://github.com/howie6879/magic_google

相关文章
|
7天前
|
Python
二分查找变种大赏!Python 中那些让你效率翻倍的搜索绝技!
二分查找是一种高效的搜索算法,适用于有序数组。其基本原理是通过不断比较中间元素来缩小搜索范围,从而快速找到目标值。常见的变种包括查找第一个等于目标值的元素、最后一个等于目标值的元素、第一个大于等于目标值的元素等。这些变种在实际应用中能够显著提高搜索效率,适用于各种复杂场景。
25 9
|
24天前
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
抓取和分析JSON数据:使用Python构建数据处理管道
|
8天前
|
算法 数据处理 开发者
超越传统:Python二分查找的变种策略,让搜索效率再上新台阶!
本文介绍了二分查找及其几种Python实现的变种策略,包括经典二分查找、查找第一个等于给定值的元素、查找最后一个等于给定值的元素以及旋转有序数组的搜索。通过调整搜索条件和边界处理,这些变种策略能够适应更复杂的搜索场景,提升搜索效率和应用灵活性。
24 5
|
21天前
|
数据采集 Python
python爬虫抓取91处理网
本人是个爬虫小萌新,看了网上教程学着做爬虫爬取91处理网www.91chuli.com,如果有什么问题请大佬们反馈,谢谢。
28 4
|
22天前
|
数据采集 Java Python
如何用Python同时抓取多个网页:深入ThreadPoolExecutor
在信息化时代,实时数据的获取对体育赛事爱好者、数据分析师和投注行业至关重要。本文介绍了如何使用Python的`ThreadPoolExecutor`结合代理IP和请求头设置,高效稳定地抓取五大足球联赛的实时比赛信息。通过多线程并发处理,解决了抓取效率低、请求限制等问题,提供了详细的代码示例和解析方法。
如何用Python同时抓取多个网页:深入ThreadPoolExecutor
|
2月前
|
安全 中间件 PHP
Google Hacking高级实战-搜索特定口子-敏感信息
Google Hacking高级实战-搜索特定口子-敏感信息
|
2月前
|
数据采集 存储 JavaScript
构建您的第一个Python网络爬虫:抓取、解析与存储数据
【9月更文挑战第24天】在数字时代,数据是新的金矿。本文将引导您使用Python编写一个简单的网络爬虫,从互联网上自动抓取信息。我们将介绍如何使用requests库获取网页内容,BeautifulSoup进行HTML解析,以及如何将数据存储到文件或数据库中。无论您是数据分析师、研究人员还是对编程感兴趣的新手,这篇文章都将为您提供一个实用的入门指南。拿起键盘,让我们开始挖掘互联网的宝藏吧!
|
2月前
|
大数据 UED 开发者
实战演练:利用Python的Trie树优化搜索算法,性能飙升不是梦!
在数据密集型应用中,高效搜索算法至关重要。Trie树(前缀树/字典树)通过优化字符串处理和搜索效率成为理想选择。本文通过Python实战演示Trie树构建与应用,显著提升搜索性能。Trie树利用公共前缀减少查询时间,支持快速插入、删除和搜索。以下为简单示例代码,展示如何构建及使用Trie树进行搜索与前缀匹配,适用于自动补全、拼写检查等场景,助力提升应用性能与用户体验。
54 2
|
2月前
|
数据采集 JavaScript 前端开发
构建简易Python爬虫:抓取网页数据入门指南
【8月更文挑战第31天】在数字信息的时代,数据抓取成为获取网络资源的重要手段。本文将引导你通过Python编写一个简单的网页爬虫,从零基础到实现数据抓取的全过程。我们将一起探索如何利用Python的requests库进行网络请求,使用BeautifulSoup库解析HTML文档,并最终提取出有价值的数据。无论你是编程新手还是有一定基础的开发者,这篇文章都将为你打开数据抓取的大门。
|
3月前
|
数据采集 JavaScript 前端开发
构建你的第一个Python爬虫:抓取网页数据入门指南
【8月更文挑战第31天】在数字时代,数据是新的石油。本文将引导初学者通过简单的步骤,使用Python编程语言创建一个基础的网络爬虫程序。我们将探索如何从网络上提取信息,并理解背后的原理。无论你是编程新手还是想要扩展你的技术工具箱,这篇文章都将为你提供一条清晰的道路,让你学会编写能够自动获取网络数据的脚本。准备好开始你的网络数据抓取之旅了吗?让我们现在就开始吧!