1.問題
博客地址
目前主流的搜索引擎尿庐,非google
莫屬,但其對(duì)于非法(流量異常港准、爬蟲)請(qǐng)求的封鎖也是異常嚴(yán)厲旨剥。
本人前段時(shí)間有個(gè)腳本用到了谷歌搜索,具體見python之由公司名推算出公司官網(wǎng)(余弦相似度)當(dāng)時(shí)直接使用的是一個(gè)python
開源項(xiàng)目浅缸。
但在使用過程中轨帜,單ip
的情況下爬取速度可謂感人,稍不留神還會(huì)被封衩椒,所以對(duì)于獲取谷歌搜索結(jié)果的爬蟲有必要進(jìn)行改進(jìn)蚌父。
說一說爬取谷歌搜索結(jié)果的問題:
1.正常打開谷歌搜索,然后審查元素想獲取目標(biāo)內(nèi)容的時(shí)候毛萌,會(huì)發(fā)現(xiàn)是一大串js苟弛。
2.訪問過快就會(huì)出現(xiàn)流量異常
2.如何解決
對(duì)于第一個(gè)問題:
應(yīng)該有看到審查元素出來的都是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后是什么樣的:
然后再看url:
https://www.google.com.hk/search?q=hello&btnG=Search&safe=active&gbv=1
對(duì)于這個(gè)url
,相信機(jī)智的你應(yīng)該會(huì)明白些什么冀痕。
這里可以寫個(gè)簡單的腳本,比如說獲取狸演,谷歌搜索第一頁所有結(jié)果的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
到了這里,問題才剛開始宵距,你可以做個(gè)實(shí)驗(yàn)腊尚,我假設(shè)你是使用代理進(jìn)行谷歌搜索,如果你連續(xù)不斷無間隔使用谷歌搜索某一關(guān)鍵字二三十下满哪,不出意外你會(huì)被要求進(jìn)行這樣的驗(yàn)證:
這個(gè)問題可真是讓人十分厭惡婿斥,我并沒有很好的解決辦法,能做的唯有盡量避免:
1.ip輪詢
2.每次結(jié)果爬取增加休眠
3.隨機(jī)user_agent是必備
第一點(diǎn)和第三點(diǎn)不必多說哨鸭,對(duì)于第二點(diǎn)增加休眠時(shí)間則需要我們好好地進(jìn)行檢測民宿。
假設(shè)在單ip隨機(jī)ua情況下:
1.這種情況下不休眠的話請(qǐng)求個(gè)兩三次就會(huì)直接被封(第二天會(huì)被解封)
2.個(gè)人覺得這不是個(gè)解決辦法,因?yàn)閷?duì)休眠時(shí)間把控不好的話就會(huì)造成封ip像鸡,如果不想被封活鹰,我測試的話需要休眠60s浮動(dòng),這沒什么意義。
3.而且這種情況下發(fā)現(xiàn)是直接封ip志群,對(duì)開發(fā)者太不友好着绷。
對(duì)于這種情況,受同事神來一句锌云,發(fā)現(xiàn)一個(gè)暫時(shí)的解決辦法荠医,請(qǐng)看下圖:
單一ip不停地訪問統(tǒng)一谷歌域名自然很容易被察覺,谷歌全球190+的域名桑涎,難道都在實(shí)時(shí)的統(tǒng)計(jì)ip么彬向,可能有,但絕對(duì)不會(huì)像單域名那樣嚴(yán)格石洗,來做個(gè)測試幢泼。
我將全球190+谷歌域名集中起來,像ua一樣隨機(jī)輪換讲衫,然后進(jìn)行測試(單ip)缕棵,結(jié)果還不錯(cuò):
1.首先沒有出現(xiàn)被封ip,只會(huì)提示流量異常
2.還是需要休眠涉兽,本人休眠515s沒有被封過招驴,可根據(jù)自身情況來,如果想穩(wěn)妥點(diǎn)就530s吧
我將這些寫成了一個(gè)項(xiàng)目枷畏,magic_google-python别厘,若你是phper,可以看看我寫的php版本php-google拥诡,具體代碼可以看這里触趴,對(duì)應(yīng)的功能很簡單:
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.總結(jié)
對(duì)google搜索結(jié)果的爬取,有以下建議:
1.ip輪詢
2.ua隨機(jī)
3.domain隨機(jī)
4.休眠