El rastreador web de aprendizaje de Python se divide principalmente en tres secciones principales: rastreo , análisis y almacenamiento.
Además, al final se presentará en detalle el marco de rastreo más utilizado, Scrapy.
Primero, enumeremos los artículos relevantes que he resumido, que cubren los conceptos básicos y las habilidades necesarias para comenzar con los rastreadores web: Ning Ge's Small Station - Web Crawler
Cuando ingresamos una URL en el navegador y presionamos Enter, ¿qué sucede en segundo plano? Por ejemplo, si ingresa http://www.lining0806.com/, verá la página de inicio del sitio web del hermano Ning.
En pocas palabras, este proceso se lleva a cabo en los siguientes cuatro pasos:
Lo que tiene que hacer un rastreador web, en pocas palabras, es implementar las funciones de un navegador. Al especificar la URL se devuelven directamente los datos requeridos por el usuario, sin necesidad de manipular manualmente el navegador para obtenerlos paso a paso.
En este paso, ¿necesita aclarar qué contenido desea obtener? ¿Es código fuente HTML o una cadena en formato Json, etc.?
La mayoría de los casos de rastreo son solicitudes de obtención, es decir, obtener datos directamente del servidor de la otra parte.
En primer lugar, Python viene con dos módulos, urllib y urllib2, que básicamente pueden satisfacer el rastreo general de páginas. Además, Requests también es un paquete muy útil, similar a este, existen httplib2, etc.
Requests:
import requests
response = requests.get(url)
content = requests.get(url).content
print "response headers:", response.headers
print "content:", content
Urllib2:
import urllib2
response = urllib2.urlopen(url)
content = urllib2.urlopen(url).read()
print "response headers:", response.headers
print "content:", content
Httplib2:
import httplib2
http = httplib2.Http()
response_headers, content = http.request(url, 'GET')
print "response headers:", response_headers
print "content:", content
Además, para las URL con campos de consulta, las solicitudes de obtención generalmente agregan los datos solicitados a la URL para dividir la URL y transmitir datos. Múltiples parámetros están conectados con &.
data = {'data1':'XXXXX', 'data2':'XXXXX'}
Requests:data为dict,json
import requests
response = requests.get(url=url, params=data)
Urllib2:data为string
import urllib, urllib2
data = urllib.urlencode(data)
full_url = url+'?'+data
response = urllib2.urlopen(full_url)
Referencia relacionada: Revisión del rastreo de clasificación de noticias de NetEase
Proyecto de referencia: el rastreador web más básico: rastreo de clasificaciones de noticias NetEase
2.1 Iniciar sesión usando el formulario
Esta situación es una solicitud posterior, es decir, los datos del formulario se envían primero al servidor y luego el servidor almacena la cookie devuelta localmente.
data = {'data1':'XXXXX', 'data2':'XXXXX'}
Requests:data为dict,json
import requests
response = requests.post(url=url, data=data)
Urllib2:data为string
import urllib, urllib2
data = urllib.urlencode(data)
req = urllib2.Request(url=url, data=data)
response = urllib2.urlopen(req)
2.2 Iniciar sesión usando cookies
Al utilizar cookies para iniciar sesión, el servidor pensará que usted es un usuario que inició sesión, por lo que le devolverá el contenido que inició sesión. Por lo tanto, si se requiere un código de verificación, puede utilizar una cookie para iniciar sesión con un código de verificación.
import requests
requests_session = requests.session()
response = requests_session.post(url=url_login, data=data)
Si hay un código de verificación, no es posible utilizar respuesta = request_session.post(url=url_login, data=data) en este momento. El método debe ser el siguiente.
response_captcha = requests_session.get(url=url_login, cookies=cookies)
response1 = requests.get(url_login) # 未登陆
response2 = requests_session.get(url_login) # 已登陆,因为之前拿到了Response Cookie!
response3 = requests_session.get(url_results) # 已登陆,因为之前拿到了Response Cookie!
Referencia relacionada: Inicio de sesión con código de verificación del rastreador web
Proyecto de referencia: nombre de usuario, contraseña y código de verificación del rastreador web: rastreo del sitio web de Zhihu
3.1 Usando un proxy
Situación aplicable: restringir las direcciones IP también puede resolver el problema de tener que ingresar un código de verificación para iniciar sesión debido a "clics frecuentes".
En este caso, la mejor manera es mantener un grupo de IP de proxy. Hay muchas IP de proxy gratuitas en Internet, y hay muchas buenas y malas. Puede encontrar las que se pueden usar mediante la detección. Para los "clics frecuentes", también podemos evitar que el sitio web nos prohíba limitando la frecuencia de los rastreadores que visitan el sitio web.
proxies = {'http':'http://XX.XX.XX.XX:XXXX'}
Requests:
import requests
response = requests.get(url=url, proxies=proxies)
Urllib2:
import urllib2
proxy_support = urllib2.ProxyHandler(proxies)
opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler)
urllib2.install_opener(opener) # 安装opener,此后调用urlopen()时都会使用安装过的opener对象
response = urllib2.urlopen(url)
3.2 Configuración de la hora
Situación aplicable: situación de frecuencia limitada.
Tanto Requests como Urllib2 pueden usar la función sleep() de la biblioteca de tiempo:
import time
time.sleep(1)
3.3 Disfrazarse de navegador o luchar contra el “anti-hotlinking”
Algunos sitios web comprobarán si realmente está accediendo a través de un navegador o si una máquina accede automáticamente. En este caso, además de Usuario-Agente, muestra que estás accediendo a través de un navegador. A veces también comprobará si la información del Referido está incluida y si su Referido es legal, generalmente además del Referido.
headers = {'User-Agent':'XXXXX'} # 伪装成浏览器访问,适用于拒绝爬虫的网站
headers = {'Referer':'XXXXX'}
headers = {'User-Agent':'XXXXX', 'Referer':'XXXXX'}
Requests:
response = requests.get(url=url, headers=headers)
Urllib2:
import urllib, urllib2
req = urllib2.Request(url=url, headers=headers)
response = urllib2.urlopen(req)
No hay mucho que decir.
def multi_session(session, *arg):
retryTimes = 20
while retryTimes>0:
try:
return session.post(*arg)
except:
print '.',
retryTimes -= 1
o
def multi_open(opener, *arg):
retryTimes = 20
while retryTimes>0:
try:
return opener.open(*arg)
except:
print '.',
retryTimes -= 1
De esta manera, podemos usar multi_session o multi_open para mantener la sesión o el abridor capturado por el rastreador.
Aquí hay una comparación experimental del rastreo paralelo para Wall Street News: rastreo multiproceso de Python y rastreo de subproceso único y multiproceso de Java
Referencia relacionada: Comparación de métodos informáticos multiproceso y multiproceso en Python y Java
Para el caso de "cargar más", utilice Ajax para transferir una gran cantidad de datos.
Cómo funciona: después de cargar el código fuente de la página web desde la URL de la página web, el programa JavaScript se ejecutará en el navegador. Estos programas cargan más contenido y "pueblan" la página web. Es por eso que si va directamente a rastrear la URL de la página web, no encontrará el contenido real de la página.
Aquí, si utiliza Google Chrome para analizar el enlace correspondiente a "Solicitar" (método: clic derecho → Inspeccionar elemento → Red → Borrar, haga clic en "Cargar más", aparecerá el enlace OBTENER correspondiente y busque el Tipo de texto/ html, haga clic para ver los parámetros de obtención o copie la URL de solicitud), proceso de bucle.
Selenium es una herramienta de prueba automatizada. Puede controlar el navegador, incluido el llenado de caracteres, los clics del mouse, la adquisición de elementos, el cambio de página y una serie de operaciones. En resumen, Selenium puede hacer cualquier cosa que pueda hacer un navegador.
Aquí se enumera el código que utiliza selenio para obtener dinámicamente información de tarifas de Qunar.com después de una lista de ciudades determinada.
Proyecto de referencia: el rastreador web Selenium utiliza el inicio de sesión proxy: rastreo del sitio web de Qunar
Para la situación en la que el sitio web tiene un código de verificación, tenemos tres métodos:
Ya hemos hablado del uso de un proxy y de cookies para iniciar sesión. Ahora hablemos de la identificación del código de verificación.
Puede utilizar el sistema Tesseract-OCR de código abierto para descargar y reconocer imágenes de códigos de verificación y transferir los caracteres reconocidos al sistema de rastreo para un inicio de sesión simulado. Por supuesto, también puede cargar la imagen del código de verificación en la plataforma de codificación para su identificación. Si no tiene éxito, puede actualizar la identificación del código de verificación nuevamente hasta que tenga éxito.
Proyecto de referencia: Proyecto de identificación de código de verificación versión 1: Captcha1
Hay dos cuestiones a las que se debe prestar atención al rastrear:
Después del rastreo, se analiza el contenido rastreado. Cualquiera que sea el contenido que necesite, puede extraer el contenido relevante de él.
Las herramientas de análisis comunes incluyen expresiones regulares, BeautifulSoup, lxml, etc.
Después de analizar qué necesitamos, el siguiente paso es almacenarlo.
Podemos optar por guardarlo en un archivo de texto, o en una base de datos MySQL o MongoDB, etc.
Hay dos cuestiones a las que se debe prestar atención al almacenar:
Scrapy es un marco de rastreo de Python de código abierto basado en Twisted, que se usa ampliamente en la industria.
Para contenido relacionado, puede consultar la construcción de un rastreador web basado en Scrapy. Al mismo tiempo, el código del proyecto de rastreo de búsqueda de WeChat presentado en este artículo se proporciona como referencia de aprendizaje.
Proyecto de referencia: utilice Scrapy o Requests para rastrear de forma recursiva los resultados de búsqueda de WeChat
Un buen rastreador web debe cumplir primero con el protocolo Robots . El nombre completo del protocolo Robots (también conocido como protocolo de rastreo, protocolo de robot, etc.) es "Protocolo de exclusión de robots". Los sitios web utilizan el protocolo Robots para indicar a los motores de búsqueda qué páginas se pueden rastrear y cuáles no.
Coloque un archivo de texto robots.txt (como https://www.taobao.com/robots.txt) en el directorio raíz del sitio web. En él, puede especificar las páginas a las que pueden acceder los diferentes rastreadores web y las páginas a las que pueden acceder. tienen prohibido el acceso a las páginas especificadas están determinadas por reglas de representación de expresiones. Antes de que el rastreador web recopile este sitio web, primero obtiene el archivo de texto robots.txt, luego analiza las reglas que contiene y luego recopila los datos del sitio web de acuerdo con las reglas.
User-agent: 指定对哪些爬虫生效
Disallow: 指定不允许访问的网址
Allow: 指定允许访问的网址
Nota: Una palabra en inglés debe estar en mayúscula. Los dos puntos están en inglés. Hay un espacio después de los dos puntos "/" que representa todo el sitio web.
禁止所有机器人访问
User-agent: *
Disallow: /
允许所有机器人访问
User-agent: *
Disallow:
禁止特定机器人访问
User-agent: BadBot
Disallow: /
允许特定机器人访问
User-agent: GoodBot
Disallow:
禁止访问特定目录
User-agent: *
Disallow: /images/
仅允许访问特定目录
User-agent: *
Allow: /images/
Disallow: /
禁止访问特定文件
User-agent: *
Disallow: /*.html$
仅允许访问特定文件
User-agent: *
Allow: /*.html$
Disallow: /