Heim > Backend-Entwicklung > Python-Tutorial > Python-Multithread-Crawling von Webseiten mit Google-Suchlinks

Python-Multithread-Crawling von Webseiten mit Google-Suchlinks

高洛峰
Freigeben: 2016-10-18 11:37:06
Original
1725 Leute haben es durchsucht

1) urllib2 BeautifulSoup erfasst Google-Suchlinks

Kürzlich habe ich an einem Projekt teilgenommen, bei dem die Verarbeitung von Google-Suchergebnissen erforderlich war. Zuvor habe ich Python-Tools im Zusammenhang mit der Verarbeitung von Webseiten kennengelernt. In praktischen Anwendungen werden urllib2 und beautifulsoup zum Crawlen von Webseiten verwendet. Beim Crawlen von Google-Suchergebnissen wird jedoch festgestellt, dass viele „schmutzige“ Links erhalten werden, wenn der Quellcode der Google-Suchergebnisseite direkt verarbeitet wird.

Sehen Sie sich das Bild unten an, um die Ergebnisse der Suche nach „titanic james“ zu sehen:

Python-Multithread-Crawling von Webseiten mit Google-Suchlinks

Die im Bild rot markierten werden nicht benötigt, und Die blau markierten müssen erfasst und verarbeitet werden.

Natürlich kann diese Art von „schmutzigem Link“ durch Regelfilterung herausgefiltert werden, aber die Komplexität des Programms wird hoch sein. Gerade als ich mit gerunzelter Stirn die Filterregeln schrieb. Ein Klassenkamerad erinnerte mich daran, dass Google relevante APIs bereitstellen sollte, und dann verstand ich es plötzlich.

(2) Google Web Search API Multithreading

Das Dokument enthält ein Beispiel für die Verwendung von Python zur Suche:

Die roten im Bild werden nicht benötigt, die blauen sind Die markierten müssen erfasst und verarbeitet werden.

Natürlich kann diese Art von „schmutzigem Link“ durch Regelfilterung herausgefiltert werden, aber die Komplexität des Programms wird hoch sein. Gerade als ich mit gerunzelter Stirn die Filterregeln schrieb. Ein Klassenkamerad erinnerte mich daran, dass Google relevante APIs bereitstellen sollte, und dann verstand ich es plötzlich.

(2) Google Web Search API Multithreading

Das Dokument enthält ein Beispiel für die Verwendung von Python für die Suche:

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..
Nach dem Login kopieren

In tatsächlichen Anwendungen kann dies erforderlich sein Zum Crawlen von Google gibt es viele Webseiten, daher ist Multithreading erforderlich, um die Crawling-Aufgabe zu teilen. Eine ausführliche Referenzeinführung zur Verwendung der Google Web Search API finden Sie hier (Standard-URL-Argumente werden hier vorgestellt). Darüber hinaus sollte besonders darauf geachtet werden, dass der Parameter rsz in der URL einen Wert unter 8 haben muss (einschließlich 8). Wenn er größer als 8 ist, wird ein Fehler gemeldet!

(3) Code-Implementierung

Es gibt immer noch Probleme bei der Code-Implementierung, aber sie kann ausgeführt werden, die Robustheit ist schlecht und ich hoffe, dass alle Experten darauf hinweisen können Wenn Sie die Fehler beseitigen (Python-Anfänger), werde ich Ihnen dankbar sein.

#-*-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()
Nach dem Login kopieren


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage