Resumen de la entrada del rastreador de Python

I. Introducción

        Los rastreadores web, también conocidos como arañas web y robots web, son programas o scripts que rastrean automáticamente información en la World Wide Web de acuerdo con ciertas reglas. Los llamados datos de rastreo son el proceso de escribir un programa para simular que el navegador navega por Internet y luego dejarlo ir al navegador para obtener los datos. Clasificación de rastreadores en escenarios de uso:

  • Rastreador general: una parte importante del sistema de rastreo. Lo que se obtiene es una página completa de datos.
  • Centrarse en los rastreadores: construido sobre la base de rastreadores generales. Lo que se rastrea es una parte específica de la página.
  • Rastreador incremental: Detecta la actualización de datos en el sitio web. Solo se rastrearán los datos actualizados más recientes del sitio web.

       Algunos datos del sitio web del portal pueden implicar problemas de privacidad o para evitar que algunos rastreadores causen daños en el sitio web, se establecerá un mecanismo anti-rastreo correspondiente para evitar que los rastreadores rastreen los datos del sitio web especificando las estrategias o los medios técnicos correspondientes. Casi al mismo tiempo que nació el mecanismo anti-escalada, nació el protocolo anti-escalada robots.txt. El protocolo robots.txt es un protocolo de caballeros, que estipula claramente qué datos en el sitio web se pueden rastrear y cuáles no. Verifique el protocolo de robots anti-escalada del sitio web: nombre de dominio / robots.txt, por ejemplo, verifique el protocolo de robots de Baidu: https://www.baidu.com/robots.txt. Con el mecanismo anti-trepa, nació el anti-anti-trepa. Mediante la formulación de estrategias o medios técnicos relevantes, el programa rastreador puede descifrar el mecanismo anti-escalada en el sitio web del portal para obtener los datos del sitio web del portal.

       Dado que rastrea información en la World Wide Web, es inevitable comprender primero los protocolos HTTP y HTTPS. El protocolo HTTP es la abreviatura de Hyper Text Transfer Protocol (Protocolo de transferencia de hipertexto), que es un protocolo de transferencia utilizado para transferir hipertexto desde un servidor World Wide Web (WWW: World Wide Web) a un navegador local. La comprensión simple es una forma de interacción de datos entre el servidor y el cliente. El protocolo HTTPS es la abreviatura de Secure Hyper Text Transfer Protocol. Establece una capa de cifrado SSL en HTTP y cifra los datos, que es más seguro que HTTP. La relación entre los dos es: HTTPS = HTTP + TLS / SSL. HTTP tiene riesgos de escucha, manipulación, secuestro de información, etc., mientras que HTTPS realizará el cifrado de la información, la verificación de la integridad y la verificación de la identidad para reducir el riesgo. Del mecanismo de trabajo de HTTPS y la relación con HTTP, se puede concluir que tienen las siguientes diferencias:

  • Costo: el protocolo HTTPS necesita solicitar un certificado en aproximadamente. Generalmente, hay menos certificados gratuitos y se requiere una cierta tarifa;
  • Transmisión: HTTP es un método de transmisión de texto claro, mientras que HTTPS es un protocolo de transmisión de hipertexto seguro, que es un protocolo de transmisión cifrado SSL seguro;
  • Puerto: HTTP y HTTPS utilizan métodos de conexión completamente diferentes, y los puertos utilizados también son diferentes: el primero utiliza el puerto 80, mientras que el segundo utiliza el puerto 443;
  • Seguridad: La conexión HTTP es muy sencilla y sin estado, mientras que el protocolo HTTPS es un protocolo de red compuesto por SSL + HTTP que se puede cifrar y autenticar, con mayor seguridad.

En el proceso de establecer una conexión, el encabezado de datos llevará mucha información importante. Información de encabezado de solicitud común: Usuario-Agente: la identidad del operador de la solicitud; Conexión: el navegador le dice al servidor a través de este encabezado si debe desconectarse o permanecer conectado después de la solicitud. Información de encabezado de respuesta común: Tipo de contenido: el servidor le dice al navegador el tipo de datos enviados a través de este encabezado.

 

En segundo lugar, rastreo de datos

       Entre los módulos involucrados en las solicitudes de red, se encuentran el módulo urllib y el módulo de solicitudes, este último es más conciso y eficiente, ahora el último es más utilizado. Para el rastreo de datos, el módulo de solicitudes también se usa principalmente aquí. El módulo de solicitudes es un módulo nativo basado en solicitudes de red en Python. Es muy poderoso, simple y conveniente de usar, y más eficiente en el manejo de las operaciones del rastreador. Su función es simular el navegador para enviar una solicitud y abrir el navegador para solicitar una página web. Primero, ingrese la URL de la solicitud en la barra de direcciones y luego presione Enter para enviar la solicitud. Una vez que el envío es exitoso, el navegador muestra la información de los datos de respuesta, que se pueden enviar por solicitudes. Las ideas de codificación para solicitudes de páginas web son las siguientes:

  1. URL especificada
  2. Enviar petición
  3. Obtener datos de respuesta
  4. Almacenamiento persistente

       A continuación, se describen los datos que se arrastran desde lo más superficial a lo más profundo. Primero, tome la solicitud de la página de inicio de Baidu (www.baidu.com) como ejemplo, use la biblioteca de solicitudes para solicitar la página de inicio de Baidu e imprima el resultado devuelto, y guarde los datos de respuesta localmente:

# -*-  coding:utf-8 -*-
import requests


# 需求:爬取百度网页的数据
if __name__ == '__main__':
    # step1: 指定url
    url = 'https://www.baidu.com/'

    # step2: 发送求情
    # get方法会返回一个响应数据
    response =  requests.get(url=url)

    # step3: 获取响应数据
    # .text返回字符串式的响应数据
    page_text = response.text
    print(page_text)

    # step4: 持久化存储
    with open('./baidu.html','w',encoding='utf-8') as fp:
        fp.write(page_text)
    print('爬取数据结束!')

       A través del código anterior, se pueden obtener los datos de la página de inicio de respuesta de Baidu. Por supuesto, para la mayoría de las personas, la función importante del navegador es buscar información. Aquí tomamos la palabra clave de búsqueda "Hola" como ejemplo para solicitar una página web:

# -*- coding:utf-8 -*-

import requests

if __name__ == '__main__':
    # UA伪装:将对应的User-Agent封装到一个字典中
    headers = {
        'User-Agent':'你的标识'
    }

    # step1: 指定url
    url = 'https://www.sogou.com/web'
    params = '你好'

    # step2: 发送请求
    response = requests.get(url=url,params=params,headers=headers)

    # step3: 获取响应数据
    page_text = response.text

    # step4: 持久化存储
    fileName = query+'.html'
    with open(fileName,'w',encoding='utf-8') as fp:
        fp.write(page_text)

    print(fileName,'保存成功!')

       El código anterior se da cuenta de abrir el navegador, ingresar palabras clave para buscar y devolver la información de datos de la página de resultados de búsqueda. La diferencia con el código anterior es que uno es establecer los parámetros adjuntos a la URL y el otro es establecer la información del encabezado para el disfraz de UA. El llamado UA, o User-Agent, es la identidad del transportista de la solicitud. Algunos portales utilizarán la detección de UA como mecanismo anti-rastreo, y su servidor detectará la identidad del operador de la solicitud. Si se detecta la identidad del operador de la solicitud como un determinado navegador, se considerará como una solicitud normal; de lo contrario, si se detecta Si la solicitud no se basa en un determinado navegador, se considera que esta no es una solicitud normal, como un programa rastreador, entonces el servidor puede rechazar el acceso y el programa rastreador no rastrea los datos. Por lo tanto, el agente de usuario se establece aquí y el disfraz de UA se realiza para hacer que el servidor solicitante piense que se trata de una solicitud normal.

       Lo anterior es para almacenar los datos de respuesta como un archivo html, y los datos de respuesta también se pueden almacenar como un archivo de formato json a través de la biblioteca json. Tome Baidu Translate como ejemplo. Cuando se ingrese el contenido de la traducción, se actualizará el contenido parcial de la página. Aquí está la tecnología ajax. Puede verificar la información de los datos de respuesta marcando -> red -> XHR, donde XHR corresponde a Solicitud de datos Ajax, después de recibir los datos de respuesta, guárdelos como un archivo de formato json. La codificación es la siguiente:

# -*- coding:utf-8 -*-

import requests
import json


if __name__ == '__main__':
    # 1、指定url
    url = 'https://fanyi.baidu.com/sug'
    # UA伪装,设置请求载体标识
    headers = {
        'User-Agent':'你的标识'
    }
    # 参数处理
    kw = input('请输入要翻译的文字:')
    data = {
        'kw':kw
    }

    # 2、发送请求
    response = requests.post(url=url,data=data,headers=headers)

    # 3、获取响应数据。json()方法返回一个json对象。
    res_obj = response.json()
    print(res_obj)

    # 4、持久化存储
    fileName = kw+'.json'
    fp = open(fileName,'w',encoding='utf-8')
    json.dump(res_obj,fp=fp,ensure_ascii=False)

    print(kw+'翻译结果已存储!')

       Además, a diferencia de las dos piezas de código anteriores, cuando se realiza el almacenamiento persistente, se asigna directamente a fp, mientras que antes se usaba la palabra clave with. with es una nueva gramática introducida desde python2.5. Es un protocolo de gestión de contexto. El propósito es eliminar las palabras clave try, except y final y el código relacionado con la asignación y liberación de recursos del diagrama de flujo, simplificando try y except , Finalmente el flujo de procesamiento. El formato de sintaxis básico es: con exp [como destino]: con cuerpo. Además, en este ejemplo, se puede encontrar que es probable que algunos datos de una página se carguen dinámicamente. Por ejemplo, los datos obtenidos por el código anterior son dinámicos y no se obtienen a través de la dirección de la barra de direcciones de la página web. Todos los ejemplos anteriores se basan directamente en la URL para capturar los datos de la página web. Si desea capturar los datos detallados de los datos de un sitio web, puede implicar el procesamiento de datos de respuesta y la redirección de la página web. Por ejemplo, el siguiente ejemplo:

# -*- coding:utf-8 -*-

import requests
import json

if __name__ == '__main__':
    # get id
    # designate home url
    home_url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList'

    # dset headers
    headers = {
        '你的标识'
    }

    #  store company id and personal name
    id_list = []
    person_list = []

    # set paramenter
    for page in range(1,6):
        page = str(page)
        params = {
            "on": "true",
            "page": page,
            "pageSize": 15,
            "productName":"",
            "conditionType": 1,
            "applyname":""

        }
        # initiate request
        res_json = requests.post(url=home_url,data=params,headers=headers).json()
        # print(res_json)
        for dic in res_json['list']:
            id_list.append(dic['ID'])


    # print(id_list)


    # start to access personal name according to id
    # designate detail url
    detail_url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById'

    # set detail paraments
    for id in id_list:
        access_detail_data = {
            "id":id
        }
        #initiate request,and get detail response
        detail_res = requests.post(url=detail_url,data=access_detail_data,headers=headers).json()
        # test
        person_list.append(detail_res['businessPerson'])

    print(person_list)

    # persistently store
    fileName = 'personalname.txt'
    fp = open(fileName,'w',encoding='utf-8')
    json.dump(person_list,fp=fp,ensure_ascii=False)

    print(fileName,'已完成存储!')

         El código anterior toma al representante legal de una empresa de cosméticos obtenido a través de la Administración de Alimentos y Medicamentos como ejemplo, rastrea los datos de varias páginas de la página web a través de un bucle, extrae la información requerida de los datos rastreados y luego empalma la información en una dirección de acuerdo con la información y rastrea la información requerida La información detallada finalmente se corta y se guarda localmente.

 

Tres, análisis de datos

       En muchos casos lo que no necesitamos no son los datos de toda la página web, sino parte de la información útil en la página web, por lo que necesitamos procesar los datos adquiridos, analizar o extraer la información requerida. El principio del análisis de datos es que el contenido de texto parcial requerido de la página web se almacenará en la etiqueta o como el atributo de la etiqueta. Al ubicar la etiqueta correspondiente, el contenido de texto requerido se puede analizar a partir de la etiqueta o el atributo de la etiqueta. Aquí hay tres resúmenes Forma: análisis regular, análisis bs4, análisis xpath. Generalmente, el análisis de datos se coloca antes del almacenamiento persistente y después de que se obtienen los datos de respuesta. El proceso de rastreo de datos mencionado anteriormente se puede extender a lo siguiente:

  • URL especificada
  • Iniciar una solicitud
  • Obtener datos de respuesta
  • análisis de los datos
  • Almacenamiento persistente

       A continuación se presentará el análisis de datos a través de tres ejemplos que utilizan expresiones regulares, bs4 y xpath para analizar.

 

1. Análisis periódico

       En el siguiente ejemplo de rastreo de la imagen de fondo de la barra de publicación, podemos ver que, en comparación con el proceso de rastreo de datos anterior, hay un proceso de análisis de datos más. Los datos de respuesta se obtienen al iniciar una solicitud a la página especificada, y luego los datos de respuesta se analizan y filtran mediante expresiones regulares. , Obtenga los datos de dirección de imagen necesarios y, finalmente, inicie una solicitud para obtener la imagen de acuerdo con los datos de dirección de imagen obtenidos y guárdelo en una carpeta local. El principio del análisis regular de Python es importar el módulo re, establecer la expresión regular correspondiente, llamar al método findall para que coincida con los datos de respuesta solicitados y filtrar los datos que cumplen con los requisitos. Desde la versión python1.5, se ha agregado el módulo re que proporciona expresiones regulares de estilo perl, lo que permite que el lenguaje Python tenga todas las funciones de expresión regular. En el código siguiente, se define una variable ex para guardar la expresión regular correspondiente, donde "." Significa todos los caracteres excepto los saltos de línea, "*" significa cualquier número de veces y "?" Significa opcional; método findll Para hacer coincidir el contenido de este artículo con expresiones regulares, aquí está el modificador re.M para la coincidencia de varias líneas, además del modificador re.I significa ignorar mayúsculas y minúsculas, re.S significa coincidencia de una sola línea, en datos de Python En el análisis, generalmente se usa el modificador re.M. Es específico según las necesidades, y se pueden usar múltiples modificadores al mismo tiempo para controlar el modo de coincidencia. Esto se logra mediante OP bit a bit (|), si desea hacer coincidir más mayúsculas y minúsculas Para los datos de fila, se establecen tanto la bandera I como la bandera M (re.I | re.M). Además, hay muchos otros modos y modificadores opcionales, consulte las expresiones regulares de Python .

# -*- coding:utf-8 -*-

import requests
import re
import os

if __name__ == '__main__':
    # 指定url
    url = 'https://tieba.baidu.com/p/6469380781'

    # 伪装UA
    headers = {
        'User-Agent': '你的标识'
    }

    # 发起请求
    res_text = requests.get(url=url,headers=headers).text

    # print(res_text)
    # 使用聚焦爬虫对网页的数据进行解析或者提取
    ex = '<img class="BDE_Image" src="(.*?)" .*?><br>'
    img_list = re.findall(ex,res_text,re.S)
    # print(img_list)

    # 创建文件夹,保存数据
    if not os.path.exists('./touxiang'):
        os.mkdir('./touxiang')

    for img in img_list:
        # 获取图片数据
        img_data = requests.get(url=img,headers=headers).content
        # 设置图片名称
        img_name = img[-10:]
        # 将图片保存至本地
        img_path = './touxiang/'+ img_name
        with open(img_path,'wb') as fp:
            fp.write(img_data)
            print(img_name,'已成功下载!')

2, análisis bs4

       El método de análisis regular anterior se puede utilizar no solo en el lenguaje Python, sino también en otros lenguajes. Es un método de análisis de datos más general. Y bs4 es un método de análisis de datos único del lenguaje Python, que solo se puede usar en el lenguaje Python. Este método de análisis requiere un analizador lxml y la instanciación del objeto BeautifulSoup, por lo que si desea utilizar bs4 para el análisis de datos, debe instalar el módulo bs4 y el módulo lxml en el entorno: pip install bs4 y pip install lxml. El principio de análisis es crear una instancia del objeto BeautifulSoup, cargar los datos que se analizarán en el objeto y luego llamar a los atributos o métodos relacionados con BeautifulSoup para ubicar los datos o extraerlos. Los datos analizados cargados en el objeto BeautifulSoup pueden provenir de un archivo local o un archivo rastreado desde la web. Si es el primero, el archivo local puede abrirse con la función open y cargarse en el objeto BeautifulSoup: soup = BeautifulSoup (open ('archivo local a analizar'), 'lxml'); si es el último, se pasarán los datos de red rastreados. El método de texto se convierte en los datos del objeto de cadena y luego se carga en el objeto BeautifulSoup: soup = BeautifulSoup ('Datos de la página web para analizar', 'lxml'). Después de cargar el objeto, realice el posicionamiento de la etiqueta o la extracción de datos según sea necesario:

  • Etiqueta de posicionamiento : soup.tagName. Por ejemplo sopa. A.
  • Obtener atributos : soup.tagName.attrs devolverá un diccionario que contiene todos los atributos de la etiqueta. Para obtener el nombre de la imagen: soup.img.attrs ['alt'] o soup.img ['alt'].
  • Obtener contenido : soup.tagName.text, soup.tagName.string, soup.tagName.get_text. El método de cadena solo puede obtener el contenido de texto directo debajo de la etiqueta, y los otros dos pueden obtener todo el contenido de texto en una etiqueta.
  • Busque una etiqueta que cumpla con los requisitos : soup.find ('tagName' [, title = "" / alt = "" / class _ = "" / id = ""]).
  • Encuentre todas las etiquetas que cumplan con los requisitos : soup.find_all ('tagName') devuelve todas las etiquetas tagName, soup.find_all ('tagName1', 'tagName1') devuelve todas las etiquetas tagName1 y tagName2, soup.find_all ('tagName', limit = 2) Regrese a las dos primeras etiquetas.
  • Seleccione el contenido especificado de acuerdo con el selector : soup.select ('tag_name / .class_name / # id_name / level selector') devolverá una lista. Para el selector de nivel, puede utilizar ">" y "". El primero representa un nivel y el segundo representa varios niveles.
# -*- coding:utf-8 -*-

import requests
from bs4 import BeautifulSoup

if __name__ == '__main__':
    # step1: 爬取章节页面的数据
    # 伪装UA
    headers = {
        'User-Agent': '你的标识'
    }
    # 指定url
    chapter_url = 'http://www.shicimingju.com/book/hongloumeng.html'
    # 发起请求
    chapter_text = requests.get(url=chapter_url,headers=headers).text

    # step2: 对章节页面的数据进行解析,获得章节标题和详情页的url,并将爬取的数据保存至本地
    # 实例化beautifulsoup对象,把章节页面的源码数据加载到该对象中
    chapter_soup = BeautifulSoup(chapter_text,'lxml')
    # print(chapter_soup)
    chapter_list = chapter_soup.select('.book-mulu > ul > li')

    fp = open('./红楼梦.txt','w',encoding='utf-8')
    for li in chapter_list:
        # 获得详情页的url、章节标题
        detail_url = 'http://www.shicimingju.com'+li.a['href']
        chapter_title = li.a.string

        # 请求详情页,获得章节详细内容
        detail_text = requests.get(url=detail_url,headers=headers).text
        # 对详情页的数据进行解析,获得每个章节的具体内容
        detail_soup = BeautifulSoup(detail_text,'lxml')
        detail_content = detail_soup.find('div',class_='chapter_content').text
        fp.write(chapter_title+':'+detail_content)
        print(chapter_title,'下载完成!')

 

3. Análisis de Xpath

        El análisis sintáctico de Xpath es el método de análisis sintáctico más utilizado, más conveniente y eficiente con una gran versatilidad. Este método de análisis tiene muchas similitudes con el bs4 anterior. En primer lugar, es necesario instalar el entorno, porque este análisis requiere un analizador lxml, y el módulo etree se utiliza para crear una instancia del objeto etree: pip install lxml. El principio de este método de análisis es crear una instancia de un objeto etree, cargar los datos del código fuente para analizarlos en el objeto etree y llamar al método xpath y la expresión xpath en etree para implementar el posicionamiento de etiquetas y la extracción de datos especificados. Los objetos cargados en etree también se pueden dividir aproximadamente en dos categorías, una son datos de archivos locales y la otra son datos de red rastreados. Si es un archivo local, llame al método de análisis para crear una instancia del objeto etree:tree = etree.parse(文件名);如是通用爬虫爬取的网络源码,使用.text将网页源码数据转化为字符串内容,再调用HTML方法加载到etree对象中:tree = etree.HTML(网页内容字符串)。实例化etree对象后,通过 xpath表达式、调用xpath方法进行标签定位和数据提取,常见的xpath表达式如下:

  •  /  Iniciar posicionamiento desde el nodo raíz, indicando un nivel; //  Indicando múltiples niveles, puede comenzar a posicionar desde cualquier posición.
  • 属性定位://div[@class="class_name"]。找到class属性值为class_name的div标签。
  • Posicionamiento de nivel e índice : //div[@class="class_name"]/tag1/tag2[1]/tag3。找到class属性值为class_name的div直系子标签tag1下的第一个自标签tag2下的直系自标签tag3。
  • Tomar atributos : //div[@class="class_name"]//tag1[3]/a/@href。获取class属性值为class_name的div的第三个直系自标签下的a标签的href属性值。
  • Tomar texto : //div[@class="class_name"]/text(),获取class属性值为class_name的div的直系文本内容;//div[@class="class_name"]//text(),获取class属性值为class_name的div标签中的所有文本内容。
  • Coincidencia aproximada://div[contains(@class, "ng")] busque la etiqueta div que contiene ng en el valor del atributo de clase;//div[starts-with(@class, "ta")],找到class属性值以ta开头的div标签
  • Operación lógica : // a [@ href = "" y @ class = "du"], encuentra la etiqueta a cuyo valor href está vacío y el valor de clase es du.
# -*- coding:utf-8 -*-

import requests
from lxml import etree
import os

if __name__ == '__main__':
    # step1: 获取图片所在网页的源码数据

    # 伪装UA
    headers = {
        'User-Agent': '你的标识'
    }
    # 指定url
    url = 'http://pic.netbian.com/4kfengjing/'
    # 发起请求
    home_text = requests.get(url=url,headers=headers).text
    # print(home_text)

    # step2: 对获取的源码数据进行解析
    home_etree = etree.HTML(home_text)
    li_list = home_etree.xpath('//div[@class="slist"]/ul/li')

    # step3: 创建文件夹,保存下载的图片文件
    if not os.path.exists('./风景图'):
        os.mkdir('./风景图')

    # print(li_list)
    for li in li_list:
        # 获取图片的地址和名称
        img_url = 'http://pic.netbian.com'+li.xpath('./a/img/@src')[0]
        img_name = li.xpath('./a/img/@alt')[0].encode('iso-8859-1').decode('gbk')+'.jpg'
        # print(img_name)
        # 访问图片地址,获取图片数据
        img_content = requests.get(url=img_url,headers=headers).content

        # 对获取的图片进行持久化存储
        save_path = './风景图/'+img_name
        with open(save_path,'wb') as fp:
            fp.write(img_content)
            print(img_name,'下载成功!')

 

 

 

Materiales de referencia:

1. Tutorial para principiantes

2. Círculo de simios

3. Introducción al desarrollo de rastreadores

Supongo que te gusta

Origin blog.csdn.net/VinWqx/article/details/104292931
Recomendado
Clasificación