Heim  >  Artikel  >  Backend-Entwicklung  >  [Python] Web Crawler (5): Nutzungsdetails von urllib2 und Website-Crawling-Techniken

[Python] Web Crawler (5): Nutzungsdetails von urllib2 und Website-Crawling-Techniken

黄舟
黄舟Original
2017-01-21 14:04:031139Durchsuche

Ich habe vorhin eine einfache Einführung in urllib2 erwähnt, und hier sind einige Details zur Verwendung von urllib2.


1. Proxy-Einstellungen

urllib2 verwendet standardmäßig die Umgebungsvariable http_proxy, um den HTTP-Proxy festzulegen.

Wenn Sie den Proxy in Ihrem Programm explizit steuern möchten, ohne von Umgebungsvariablen beeinflusst zu werden, können Sie einen Proxy verwenden.

Erstellen Sie einen neuen Test14, um eine einfache Proxy-Demo zu implementieren:

import urllib2  
enable_proxy = True  
proxy_handler = urllib2.ProxyHandler({"http" : 'http://some-proxy.com:8080'})  
null_proxy_handler = urllib2.ProxyHandler({})  
if enable_proxy:  
    opener = urllib2.build_opener(proxy_handler)  
else:  
    opener = urllib2.build_opener(null_proxy_handler)  
urllib2.install_opener(opener)

Ein hier zu beachtendes Detail ist, dass durch die Verwendung von urllib2.install_opener() der globale Öffner von urllib2 festgelegt wird.

Dies ist für die spätere Verwendung sehr praktisch, bietet jedoch keine detailliertere Steuerung, z. B. den Wunsch, zwei verschiedene Proxy-Einstellungen im Programm zu verwenden.

Ein besserer Ansatz besteht darin, nicht install_opener zum Ändern der globalen Einstellungen zu verwenden, sondern direkt die open-Methode des Openers anstelle der globalen urlopen-Methode aufzurufen.


2. Timeout-Einstellung
In alten Versionen von Python (vor Python 2.6) stellt die API von urllib2 die Timeout-Einstellung nicht zur Verfügung. Um den Timeout-Wert festzulegen, können Sie nur den globalen Wert ändern Zeitüberschreitung des Socket-Werts.

import urllib2  
import socket  
socket.setdefaulttimeout(10) # 10 秒钟后超时  
urllib2.socket.setdefaulttimeout(10) # 另一种方式

Nach Python 2.6 kann das Timeout direkt über den Timeout-Parameter von urllib2.urlopen() eingestellt werden.

import urllib2  
response = urllib2.urlopen('http://www.google.com', timeout=10)

3. Fügen Sie der HTTP-Anfrage einen bestimmten Header hinzu

Um einen Header hinzuzufügen, müssen Sie das Request-Objekt verwenden:

import urllib2  
request = urllib2.Request('http://www.baidu.com/')  
request.add_header('User-Agent', 'fake-client')  
response = urllib2.urlopen(request)  
print response.read()

Achten Sie bei einigen Headern besonders darauf, dass der Server diese Header überprüft
User-Agent: Einige Server oder Proxys verwenden diesen Wert, um zu bestimmen, ob die Anfrage vom Browser erfolgt
Content-Type: Bei Verwendung Die REST-Schnittstelle prüft der Server. Dieser Wert wird verwendet, um zu bestimmen, wie der Inhalt im HTTP-Body analysiert werden soll. Allgemeine Werte sind:
application/xml: Verwenden Sie
application/json, wenn Sie XML RPC aufrufen, z. B. RESTful/SOAP: Verwenden Sie
application/x-www-form-urlencoded, wenn Sie JSON RPC aufrufen: Verwenden Sie
Wenn der Browser ein Webformular sendet, wenn der vom Server bereitgestellte RESTful- oder SOAP-Dienst verwendet wird, führt eine falsche Inhaltstypeinstellung dazu, dass der Server den Dienst verweigert



4.Redirect
urllib2 leitet standardmäßig automatisch für HTTP 3XX-Rückgabecodes um, ohne manuelle Konfiguration. Um festzustellen, ob eine Umleitungsaktion stattgefunden hat, prüfen Sie einfach, ob die URL der Antwort und die URL der Anfrage konsistent sind.

import urllib2  
my_url = 'http://www.google.cn'  
response = urllib2.urlopen(my_url)  
redirected = response.geturl() == my_url  
print redirected  
  
my_url = 'http://rrurl.cn/b1UZuP'  
response = urllib2.urlopen(my_url)  
redirected = response.geturl() == my_url  
print redirected

Wenn Sie nicht automatisch umleiten möchten, können Sie zusätzlich zur Verwendung der untergeordneten httplib-Bibliothek auch die HTTPRedirectHandler-Klasse anpassen.

import urllib2  
class RedirectHandler(urllib2.HTTPRedirectHandler):  
    def http_error_301(self, req, fp, code, msg, headers):  
        print "301"  
        pass  
    def http_error_302(self, req, fp, code, msg, headers):  
        print "303"  
        pass  
  
opener = urllib2.build_opener(RedirectHandler)  
opener.open('http://rrurl.cn/b1UZuP')

5. Cookie

urllib2 verarbeitet Cookies auch automatisch. Wenn Sie den Wert eines Cookie-Elements ermitteln müssen, können Sie Folgendes tun:

import urllib2  
import cookielib  
cookie = cookielib.CookieJar()  
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))  
response = opener.open('http://www.baidu.com')  
for item in cookie:  
    print 'Name = '+item.name  
    print 'Value = '+item.value

Nach dem Ausführen wird der Cookie-Wert für den Besuch von Baidu ausgegeben:

[Python] Web Crawler (5): Nutzungsdetails von urllib2 und Website-Crawling-Techniken

6 .Verwenden Sie HTTP PUT- und DELETE-Methoden

urllib2 unterstützt nur HTTP GET- und POST-Methoden. Wenn Sie HTTP PUT und DELETE verwenden möchten, können Sie nur die untergeordnete httplib-Bibliothek verwenden. Trotzdem können wir urllib2 weiterhin aktivieren, um PUT- oder DELETE-Anfragen auf folgende Weise auszugeben:

import urllib2  
request = urllib2.Request(uri, data=data)  
request.get_method = lambda: 'PUT' # or 'DELETE'  
response = urllib2.urlopen(request)

7. Holen Sie sich den HTTP-Rückgabecode

Für 200 OK, solange Sie können Rufen Sie den HTTP-Rückgabecode mit der Methode getcode() des von urlopen zurückgegebenen Antwortobjekts ab. Bei anderen Rückkehrcodes löst urlopen jedoch eine Ausnahme aus. Zu diesem Zeitpunkt ist es notwendig, das Codeattribut des Ausnahmeobjekts zu überprüfen:

import urllib2  
try:  
    response = urllib2.urlopen('http://bbs.csdn.net/why')  
except urllib2.HTTPError, e:  
    print e.code

8. Debug-Protokoll

Bei Verwendung von urllib2 können Sie das Debug-Protokoll mit der folgenden Methode öffnen , damit Sie Pakete senden und empfangen können. Der Inhalt wird auf dem Bildschirm gedruckt, was zum Debuggen praktisch ist. Manchmal können Sie die Arbeit der Paketerfassung sparen

import urllib2  
httpHandler = urllib2.HTTPHandler(debuglevel=1)  
httpsHandler = urllib2.HTTPSHandler(debuglevel=1)  
opener = urllib2.build_opener(httpHandler, httpsHandler)  
urllib2.install_opener(opener)  
response = urllib2.urlopen('http://www.google.com')

Auf diese Weise können Sie die sehen Inhalt des übertragenen Datenpakets:

[Python] Web Crawler (5): Nutzungsdetails von urllib2 und Website-Crawling-Techniken


9. Formularverarbeitung

Das Ausfüllen des Formulars ist erforderlich Anmelden. Wie fülle ich das Formular aus?

Erfassen Sie zunächst mit dem Tool den Inhalt des auszufüllenden Formulars.
Zum Beispiel verwende ich normalerweise das Firefox+httpfox-Plugin, um zu sehen, welche Pakete ich gesendet habe.
Nehmen Sie verycd als Beispiel. Suchen Sie zunächst die von Ihnen gesendete POST-Anfrage und die POST-Formularelemente.
Sie können sehen, dass Sie für verycd Benutzername, Passwort, continueURI, fk und login_submit eingeben müssen. Unter anderem wird fk zufällig generiert (eigentlich nicht zu zufällig, es sieht so aus, als würde es einfach durch Codieren der Epochenzeit generiert). ). Es muss von der Webseite abgerufen werden, was bedeutet, dass Sie zuerst die Webseite besuchen und Tools wie reguläre Ausdrücke verwenden müssen, um das fk-Element in den zurückgegebenen Daten abzufangen. Wie der Name schon sagt, kann continueURI beiläufig geschrieben werden, während login_submit fest ist, was aus dem Quellcode ersichtlich ist. Es gibt auch Benutzernamen und Passwörter, die offensichtlich sind:

# -*- coding: utf-8 -*-  
import urllib  
import urllib2  
postdata=urllib.urlencode({  
    'username':'汪小光',  
    'password':'why888',  
    'continueURI':'http://www.verycd.com/',  
    'fk':'',  
    'login_submit':'登录'  
})  
req = urllib2.Request(  
    url = 'http://secure.verycd.com/signin',  
    data = postdata  
)  
result = urllib2.urlopen(req)  
print result.read()

10 Als Browser getarnt, um darauf zuzugreifen
Einige Websites sind vom Besuch von Crawlern abgeneigt und lehnen Anfragen von Crawlern ab
Zu diesem Zeitpunkt müssen wir uns als Browser tarnen, was durch Ändern des Headers im http-Paket erreicht werden kann

#…  
  
headers = {  
    'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'  
}  
req = urllib2.Request(  
    url = 'http://secure.verycd.com/signin/*/http://www.verycd.com/',  
    data = postdata,  
    headers = headers  
)  
#...

Umgang mit „Anti-Hotlinking“
Einige Websites haben so- sogenannte Anti-Hotlinking-Einstellungen. Um es ganz klar auszudrücken:


ist es, im Header der Anfrage zu überprüfen, ob es sich um seine eigene handelt Sie haben gesendet.

Wir müssen also nur die Überschriften wie folgt einfügen: Nehmen Sie einfach den Verweis auf die Website:

#...
headers = {
    'Referer':'http://www.cnbeta.com/articles'
}
#...


Header ist eine Diktatdatenstruktur. Sie können einen beliebigen Header einfügen.

Einige Websites lesen beispielsweise gerne das X-Forwarde-For im Header, um ihre tatsächliche IP zu sehen. Sie können das X-Forwarde-For direkt ändern.

Das Obige ist [Python] Web Crawler (5): Nutzungsdetails von urllib2 und Website-Crawling-Techniken. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!


Stellungnahme:
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