Python crawler series: comience a ingresar al análisis de datos del suelo (2)

Clasificación de análisis de datos

Regular

Ejemplo: use el enfoque regular para rastrear imágenes

Sitio web rastreado: https://818ps.com/search/0-0-0-0-0-null-0_0_0_67-0-0-0-0.html

Inserte la descripción de la imagen aquí
Punto clave: Analice en qué pieza se debe encontrar la dirección de la imagen, puede usar. *? Para omitir la parte innecesaria

ex = '<div class="min-img" has-ajax="0" style="width:216px;height:384px">.*?<img.*?src="(.*?)".*?</div>'
img_src_list = re.findall(ex, page_text, re.S)

Código:

import requests
import random
import re
import os

user_agent_list=[
            'Mozilla/5.0(compatible;MSIE9.0;WindowsNT6.1;Trident/5.0)',
            'Mozilla/4.0(compatible;MSIE8.0;WindowsNT6.0;Trident/4.0)',
            'Mozilla/4.0(compatible;MSIE7.0;WindowsNT6.0)',
            'Opera/9.80(WindowsNT6.1;U;en)Presto/2.8.131Version/11.11',
            'Mozilla/5.0(WindowsNT6.1;rv:2.0.1)Gecko/20100101Firefox/4.0.1',
            'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER',
            'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)',
            'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0',
            'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.3.4000 Chrome/30.0.1599.101 Safari/537.36',
            'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 UBrowser/4.0.3214.0 Safari/537.36',
            'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60',
            'Opera/8.0 (Windows NT 5.1; U; en)',
            'Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.50',
            'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.50',
            'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0',
            'Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10',
            'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2',
            'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36',
            'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11'
        ]

if __name__ == '__main__':
    # 创建一个文件夹,保存所有的图片
    if not os.path.exists('./img'):
        os.mkdir('./img')
    # 如何爬取图片数据
    url = 'https://818ps.com/search/0-0-0-0-0-null-0_0_0_67-0-0-0-0.html'
    header = {
    
     'User-Agent': random.choice(user_agent_list) }
    # 使用通用爬虫对url对应的一整张页面进行爬取
    page_text = requests.get(url=url, headers=header).text
    # 使用聚焦爬虫将页面中所有的图片进行解析/提取  正则, 获取的是()中的.*?
    ex = '<div class="min-img" has-ajax="0" style="width:216px;height:384px">.*?<img.*?src="(.*?)".*?</div>'
    img_src_list = re.findall(ex, page_text, re.S)
    # print(img_src_list)
    for index,src in enumerate(img_src_list):
#         拼接出完整路径
        if ("http" in src):
            continue
        else:
            src = 'http:' + src
        print(src)
        # 请求到了图片的二进制数据
        img_data = requests.get(url=src, headers=header).content
        with open('./img/' + str(index) + '.jpg', 'wb') as fp:
            fp.write(img_data)

efecto:
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

bs4

bs4 se da cuenta del principio de análisis de datos:

  • 1. Cree una instancia de BeautifulSoup y cargue los datos de origen de la página en el objeto.
  • 2. Posicionamiento de etiquetas y extracción de datos llamando a atributos o métodos relacionados en el objeto BeautifulSoup

Instalación ambiental:
pip install bs4
pip install lxml

Cómo crear una instancia del objeto BeautifulSoup:

  • from bs4 import BeautifulSoup
  • Instanciación de objetos
    • 1. Cargue los datos en el documento HTML local en el objeto.
from bs4 import BeautifulSoup

if __name__ == '__main__':
    # 将HTML文档中数据加载到BeautifulSoup对象中
    fp = open('./colorPicker.html', 'r', encoding='utf-8')
    soup = BeautifulSoup(fp, 'lxml')
    print(soup)
* 2.将互联网上获取的页面源码加载到该对象中

Atributos y métodos para el análisis de datos proporcionados por bs4

  • tagName: Soup.tagName devuelve la impresión de la etiqueta tagName (soup.li) que aparece por primera vez en HTML
  • find(): Soup.find ('div') es equivalente a soup.div soup.find ('div', class _ = 'aa') para encontrar el div cuya clase es aa
  • find_all(): Soup.find_all ('div') devuelve una lista
  • select: Soup.select ('. Aa') puede usar un determinado atributo selector para buscar, y también puede usar la jerarquía para encontrar soup.select ('. Aa> ul> li> a') , y devuelve una lista
  • get_text(): Obtiene los datos de texto entre etiquetas, soup.a.text / string / get_text ()
  • ['属性']: Obtiene el valor del atributo de la etiqueta, soup.a ['href']

Ejercicio práctico: rastrear todos los títulos y contenidos de los capítulos de Romance of the Three Kingdoms

Página de rastreo: https://www.shicimingju.com
Inserte la descripción de la imagen aquí
código de página:

from bs4 import BeautifulSoup
import requests
import random

if __name__ == '__main__':
    header = {
    
    'User-Agent': 'Mozilla/4.0(compatible;MSIE8.0;WindowsNT6.0;Trident/4.0)'}
    url = 'https://www.shicimingju.com/book/sanguoyanyi.html'
    page_text = requests.get(url=url, headers=header)
    page_text.encoding = 'utf-8'
    # 在首页中解析出章节的标题和详情页url
    # 1.实例化BeautifulSoup对象,需要将页面源码数据加载到该对象中
    soup = BeautifulSoup(page_text.text, 'lxml')
    li_list = soup.select('.book-mulu > ul > li')
    fp = open('./sanguo.txt', 'w', encoding='utf-8')
    for li in  li_list:
        title = li.a.text
        detail_url = 'https://www.shicimingju.com' + li.a['href']
        # 对详情页发起请求,解析出章节内容
        detail_content_text = requests.get(url=detail_url, headers=header)
        detail_content_text.encoding = 'utf-8'
        # 解析出详情页中相关章节内容
        detail_soup = BeautifulSoup(detail_content_text.text, 'lxml')
        div_tag = detail_soup.find('div', class_='chapter_content')
        # 解析到了章节的内容
        content = div_tag.text
        # 持久化存储
        fp.write(title+':'+ content + '\n')
        print(title + '---爬取成功!')

efecto:
Inserte la descripción de la imagen aquí

xpath

Análisis de Xpath: el método de análisis más utilizado, más conveniente y eficiente. Versatilidad.

Principio de análisis de Xpath

  • 1. Cree una instancia de un objeto etree y cargue los datos de origen de la página analizados en el objeto.
  • 2. Llame al método xpath en el objeto etree combinado con la expresión xpath para lograr el posicionamiento de la etiqueta y la captura de contenido.

Instalación ambiental

pip install lxml

Cómo crear instancias de objetos etree

  • 1. Cargue los datos del código fuente en el documento HTML local en el objeto etree : etree.parse ()
  • 2. Los datos del código fuente obtenidos de Internet se pueden cargar en el objeto: etree.HTML ('page_text')

Ejemplo de xpath ('expresión xpath')
:

tree = etree.parse('test.html')
tree.xpath('/html/head/title')  //此时返回的是存储地址

expresión xpath

  • /: Indica que el posicionamiento comienza desde el nodo raíz. Representa un nivel
  • //: Representa varios niveles. Puede comenzar a posicionarse desde cualquier posición
  • [@class="属性值"]: Posicionamiento de atributos // div [@ class = “aa”] // div [@ class = “aa”] / ul / li
  • [1]: Posicionamiento del índice, el índice comienza desde 1 // div [3]
  • text(): Obtener texto ** // div [3] / a / text () ** / text () Obtener el contenido de texto directo en la etiqueta // texto () Obtener el contenido de texto no directo en la etiqueta (todo el contenido de texto )
  • /@attrName img/@src

combate xpath

Descarga de análisis de imágenes

Fuente de la imagen: Biantu.com

Inserte la descripción de la imagen aquí
Código:

import requests
from lxml import etree
import os

if __name__ == '__main__':
    # 创建一个文件夹,保存所有的图片
    if not os.path.exists('./img'):
        os.mkdir('./img')
    url = 'http://pic.netbian.com/4kmeinv/'
    header = {
    
    'User-Agent': 'Mozilla/4.0(compatible;MSIE8.0;WindowsNT6.0;Trident/4.0)'}
    page = requests.get(url=url, headers=header)
    page.encoding = 'gbk'
    page_text = page.text
    tree = etree.HTML(page_text)
    # 数据解析,src的数据值
    li_list = tree.xpath('//div[@class="slist"]/ul/li')
    for li in li_list:
        imgsrc = 'http://pic.netbian.com' + li.xpath('./a/img/@src')[0]
        imgname = li.xpath('./a/img/@alt')[0] + '.jpg'
        # 通用处理中文乱码的解决方案
        # imgname.encode('iso-8859-1').decode('gbk')

        # 图片持久化存储
        img_data = requests.get(url=imgsrc, headers=header).content
        with open('./img/' + imgname, 'wb') as fp:
            fp.write(img_data)
            print(imgname, imgsrc, '存储成功')

efecto:
Inserte la descripción de la imagen aquí

Resumen de principios

  • El contenido de texto local analizado se almacenará entre las etiquetas o en los atributos correspondientes a las etiquetas
  • 1. Coloque la etiqueta designada
  • 2. Extraiga (analice) el valor de los datos almacenados en la etiqueta o el atributo correspondiente a la etiqueta

Supongo que te gusta

Origin blog.csdn.net/qq_36171287/article/details/113786052
Recomendado
Clasificación