搜尋
首頁後端開發Python教學Python多執行緒抓取Google搜尋連結網頁

Python多執行緒抓取Google搜尋連結網頁

Oct 18, 2016 am 11:37 AM
googlepython多執行緒抓取

1)urllib2+BeautifulSoup抓取Goolge搜尋連結

近期,參與的專案需要對Google搜尋結果進行處理,之前學習了Python處理網頁相關的工具。在實際應用程式中,使用了urllib2和beautifulsoup來進行網頁的抓取,但是在抓取google搜尋結果的時候,發現如果是直接對google搜尋結果頁面的原始碼進行處理,會得到很多「髒」連結。

看下圖為搜尋「titanic  james」的結果:

Python多執行緒抓取Google搜尋連結網頁

圖中紅色標記的是不需要的,藍色標記的是需要抓取處理的。

這種「髒連結」當然可以透過規則過濾的方法來過濾掉,但是這樣程式的複雜度就高了。正當自己愁眉苦臉的正在寫過濾規則時。同學提醒說google應該提供相關的api,才恍然大明白。

(2)Google Web Search API+多執行緒

文件中給出使用Python進行搜尋的例子:

圖中紅色標記的是不需要的,藍色標記的是需要抓取處理的。

這種「髒連結」當然可以透過規則過濾的方法來過濾掉,但是這樣程式的複雜度就高了。正當自己愁眉苦臉的正在寫過濾規則時。同學提醒說google應該提供相關的api,才恍然大明白。

(2)Google Web Search API+多執行緒

文件中給出使用Python進行搜尋的例子:

import simplejson
    
# The request also includes the userip parameter which provides the end 
# user's IP address. Doing so will help distinguish this legitimate 
# server-side traffic from traffic which doesn't come from an end-user. 
url = ('https://ajax.googleapis.com/ajax/services/search/web'
       '?v=1.0&q=Paris%20Hilton&userip=USERS-IP-ADDRESS')
    
request = urllib2.Request(
    url, None, {'Referer': /* Enter the URL of your site here */})
response = urllib2.urlopen(request)
    
# Process the JSON string. 
results = simplejson.load(response)
# now have some fun with the results...
  
import simplejson
   
# The request also includes the userip parameter which provides the end
# user's IP address. Doing so will help distinguish this legitimate
# server-side traffic from traffic which doesn't come from an end-user.
url = ('https://ajax.googleapis.com/ajax/services/search/web'
       '?v=1.0&q=Paris%20Hilton&userip=USERS-IP-ADDRESS')
   
request = urllib2.Request(
    url, None, {'Referer': /* Enter the URL of your site here */})
response = urllib2.urlopen(request)
   
# Process the JSON string.
results = simplejson.load(response)
# now have some fun with the results..

實際應用中可能需要抓取google的許多網頁,所以還需要使用多執行緒來分擔抓取任務。使用google web search api的參考詳細介紹,請看此處(這裡介紹了Standard URL Arguments)。另外要特別注意,url中參數rsz必須是8(包括8)以下的值,若大於8,會報錯的!

(3)程式碼實作

程式碼實作仍有問題,但是能夠運行,魯棒性差,還需要進行改進,希望各路大神指出錯誤(初學Python),不勝感激。

#-*-coding:utf-8-*- 
import urllib2,urllib
import simplejson
import os, time,threading
   
import common, html_filter
#input the keywords 
keywords = raw_input('Enter the keywords: ')                                 
   
#define rnum_perpage, pages 
rnum_perpage=8
pages=8                       
   
#定义线程函数 
def thread_scratch(url, rnum_perpage, page):
 url_set = [] 
 try:
   request = urllib2.Request(url, None, {'Referer': 'http://www.sina.com'})
   response = urllib2.urlopen(request)
   # Process the JSON string. 
   results = simplejson.load(response)
   info = results['responseData']['results']
 except Exception,e:
   print 'error occured'
   print e
 else:
   for minfo in info:
      url_set.append(minfo['url'])
      print minfo['url']
  #处理链接 
 i = 0
 for u in url_set:
   try:
     request_url = urllib2.Request(u, None, {'Referer': 'http://www.sina.com'})
     request_url.add_header(
     'User-agent',
     'CSC'
     )
     response_data = urllib2.urlopen(request_url).read()
     #过滤文件 
     #content_data = html_filter.filter_tags(response_data) 
     #写入文件 
     filenum = i+page
     filename = dir_name+'/related_html_'+str(filenum)
     print '  write start: related_html_'+str(filenum)
     f = open(filename, 'w+', -1)
     f.write(response_data)
     #print content_data 
     f.close()
     print '  write down: related_html_'+str(filenum)
   except Exception, e:
     print 'error occured 2'
     print e
   i = i+1
 return
   
#创建文件夹 
dir_name = 'related_html_'+urllib.quote(keywords)
if os.path.exists(dir_name):
   print 'exists  file'
   common.delete_dir_or_file(dir_name)
os.makedirs(dir_name)
   
#抓取网页 
print 'start to scratch web pages:'
for x in range(pages):
  print "page:%s"%(x+1)
  page = x * rnum_perpage
  url = ('https://ajax.googleapis.com/ajax/services/search/web'
                  '?v=1.0&q=%s&rsz=%s&start=%s') % (urllib.quote(keywords), rnum_perpage,page)
  print url
  t = threading.Thread(target=thread_scratch, args=(url,rnum_perpage, page))
  t.start()
#主线程等待子线程抓取完 
main_thread = threading.currentThread()
for t in threading.enumerate():
  if t is main_thread:
    continue
  t.join()


陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Python:編譯器還是解釋器?Python:編譯器還是解釋器?May 13, 2025 am 12:10 AM

Python是解釋型語言,但也包含編譯過程。 1)Python代碼先編譯成字節碼。 2)字節碼由Python虛擬機解釋執行。 3)這種混合機制使Python既靈活又高效,但執行速度不如完全編譯型語言。

python用於循環與循環時:何時使用哪個?python用於循環與循環時:何時使用哪個?May 13, 2025 am 12:07 AM

UseeAforloopWheniteratingOveraseQuenceOrforAspecificnumberoftimes; useAwhiLeLoopWhenconTinuingUntilAcIntiment.forloopsareIdealForkNownsences,而WhileLeleLeleLeleLeleLoopSituationSituationsItuationsItuationSuationSituationswithUndEtermentersitations。

Python循環:最常見的錯誤Python循環:最常見的錯誤May 13, 2025 am 12:07 AM

pythonloopscanleadtoerrorslikeinfiniteloops,modifyingListsDuringteritation,逐個偏置,零indexingissues,andnestedloopineflinefficiencies

對於循環和python中的循環時:每個循環的優點是什麼?對於循環和python中的循環時:每個循環的優點是什麼?May 13, 2025 am 12:01 AM

forloopsareadvantageousforknowniterations and sequests,供應模擬性和可讀性;而LileLoopSareIdealFordyNamicConcitionSandunknowniterations,提供ControloperRoverTermination.1)forloopsareperfectForeTectForeTerToratingOrtratingRiteratingOrtratingRitterlistlistslists,callings conspass,calplace,cal,ofstrings ofstrings,orstrings,orstrings,orstrings ofcces

Python:深入研究彙編和解釋Python:深入研究彙編和解釋May 12, 2025 am 12:14 AM

pythonisehybridmodeLofCompilation和interpretation:1)thepythoninterpretercompilesourcecececodeintoplatform- interpententbybytecode.2)thepythonvirtualmachine(pvm)thenexecutecutestestestestestesthisbytecode,ballancingEaseofuseEfuseWithPerformance。

Python是一種解釋或編譯語言,為什麼重要?Python是一種解釋或編譯語言,為什麼重要?May 12, 2025 am 12:09 AM

pythonisbothinterpretedAndCompiled.1)它的compiledTobyTecodeForportabilityAcrosplatforms.2)bytecodeisthenInterpreted,允許fordingfordforderynamictynamictymictymictymictyandrapiddefupment,儘管Ititmaybeslowerthananeflowerthanancompiledcompiledlanguages。

對於python中的循環時循環與循環:解釋了關鍵差異對於python中的循環時循環與循環:解釋了關鍵差異May 12, 2025 am 12:08 AM

在您的知識之際,而foroopsareideal insinAdvance中,而WhileLoopSareBetterForsituations則youneedtoloopuntilaconditionismet

循環時:實用指南循環時:實用指南May 12, 2025 am 12:07 AM

ForboopSareSusedwhenthentheneMberofiterationsiskNownInAdvance,而WhileLoopSareSareDestrationsDepportonAcondition.1)ForloopSareIdealForiteratingOverSequencesLikelistSorarrays.2)whileLeleLooleSuitableApeableableableableableableforscenarioscenarioswhereTheLeTheLeTheLeTeLoopContinusunuesuntilaspecificiccificcificCondond

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器