[Introducción al rastreador de Python] Exporte imágenes y registre información como una tabla


Descargar imágenes del sitio web.


Hay tres partes para descargar imágenes de sitios web con HTTP: tomar el código fuente de la página web; obtener el hipervínculo de la imagen; descargar la imagen a la carpeta local de acuerdo con la URL del hipervínculo de la imagen .


urllib usa request.urlopen() para abrir y leer información URL, y la respuesta del objeto devuelto es como un objeto de texto, que se puede leer llamando a read(). El siguiente código imprimirá la información HTML recopilada de la página web:
from urllib import request
response = request.urlopen("http://fanyi.baidu.com")
html = response.read()
html = html.decode("utf-8")  # decode()命令将网页信息解码,否则乱码
print(html)

Verifique el método de codificación de la página web: use un navegador para ver el código fuente de la página web, llame a la herramienta de desarrollador para seleccionar el elemento o presione directamente la tecla de acceso directo F12, solo necesita encontrar el conjunto de caracteres al comienzo de la etiqueta head ( en un meta determinado), y sabrá qué tipo de codificación utiliza la página web.

Por favor agregue una descripción de la imagen.

Hay dos métodos generales para descargar archivos de páginas web localmente: uno es usar la función request.urlretrieve() y el otro es usar la función write() de operación de archivos de Python para escribir archivos . El siguiente es un código de muestra para rastrear imágenes en el sitio web y descargarlas localmente:

'''
    第一个简单的爬取图片程序,使用Python3.x和urllib库
'''

import urllib.request
import re
import os


def getHtmlCode(url):  # 该方法传入url,返回url的html源码
    headers = {
    
    
        'User - Agent': 'Mozilla/5.0(Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWEBkIT/537.36(KHTML,like Cecko)Chorme/56.0.2924.87 Mobile Safari/537.36'
    }

    # Request 函数将url添加头部,模拟浏览器访问
    url1 = urllib.request.Request(url, headers=headers)
    page = urllib.request.urlopen(url1).read()  # 将url1页面的源代码保存成字符串
    page = page.decode('GB2312', 'ignore')  # 字符串转码

    return page


def getImg(page):  # 该方法传入html的源码,经过截取其中的img标签,将图片保存到本机
    # 考虑采用https还是http协议
    imgList = re.findall(r'(https:[^\s]*?(jpg|png|gif))', page)
    x = 100
    if not os.path.exists("E:/img1"):
        os.mkdir("E:/img1")

    for imgUrl in imgList:
        try:
            print('正在下载: %s' % imgUrl[0])
            urllib.request.urlretrieve(
                imgUrl[0], 'E:/img1/%d.%s' % (x, imgUrl[1]))
            x += 1
        except:
            continue


if __name__ == '__main__':
    url = 'https://www.book123.info/list?key=python'  # 搜索无名图书python的网址页面
    page = getHtmlCode(url)
    # page = urllib.request.urlopen(url).read()  # 将url1页面的源代码保存成字符串
    # page = page.decode('GB2312', 'ignore')  # 字符串转码
    # page = getHtmlCode(url)
    getImg(page)

inserte la descripción de la imagen aquí

De hecho, los sitios web convencionales ya tienen cierta tecnología anti-rastreo, por lo que aquí se selecciona un sitio web sin fines de lucro como Wuming Books.com para practicar el rastreo. Es posible que sea necesario ajustar aún más el rastreo de los sitios web principales, como el uso de tecnología de cookies para completar la verificación de inicio de sesión de la cuenta.



Extraiga registros de contenido del sitio web como tablas


Dado que las expresiones regulares tardarán algún tiempo en comenzar, tomando prestada la biblioteca de terceros BeautifulSoup , puede interceptar el contenido de la página web de acuerdo con el nombre de la etiqueta, y la operación será más intuitiva en este momento.

BeautifulSoup es una biblioteca de funciones para Python para procesar HTML/XML . Es una herramienta de análisis de páginas web incorporada en Python. Se utiliza para convertir rápidamente páginas web capturadas. Proporciona algunos métodos simples y una sintaxis similar a Python para buscar, localizar y modificar un árbol de conversión después del árbol DOM . Hay los documentos chinos correspondientes como referencia y es más fácil de aprender.


Puede crear un objeto beautifulSoup con una cadena que contenga contenido html, un archivo HTML local o una URL. El proceso de creación de una URL es el siguiente:

from urllib import request
from bs4 import BeautifulSoup

response = request.urlopen("http://www.baidu.com")
html = response.read()
html = html.decode("utf-8")
soup = BeautifulSoup(html, 'html.parser')
print(soup.prettify())  # 格式化输出内容

Por favor agregue una descripción de la imagen.

Beautiful Soup convierte documentos HTML complejos en una estructura de árbol compleja, cada nodo es un objeto Python y todos los objetos se pueden resumir en los siguientes cuatro tipos:

  • Etiqueta
  • Cadena navegable
  • hermosasopa
  • Comentario

La etiqueta es una etiqueta en HTML

print(soup.title)
print(soup.head)

NavigableString puede extraer el texto dentro de la etiqueta → muy simple, solo usa una cadena

print(soup.title.string)

BeautifulSoup representa el contenido completo de un documento. La mayoría de las veces se puede considerar como un objeto Tag, que es una etiqueta especial. El siguiente código puede obtener su tipo, nombre y atributos respectivamente.

print(type(soup))
print(soup.name)
print(soup.attrs)

El objeto Comment es un tipo especial de objeto NavigableString y su contenido no incluye símbolos de comentarios. Si no se maneja adecuadamente, puede causar problemas inesperados al procesador de texto.


Nota sobre .string: si no hay ninguna etiqueta en una etiqueta, ".string" devolverá el contenido de la etiqueta. Si solo hay una etiqueta en la etiqueta, ".string" también devolverá el contenido de la etiqueta más interna. Si la etiqueta contiene varios nodos de subetiqueta, no se puede determinar qué nodo de subetiqueta debe llamarse mediante el método .string y el resultado de ".string" es "Ninguno".


Para evitar que la IP se bloquee durante la recopilación, a menudo se utilizan servidores proxy. A continuación se muestra el proceso de rastrear la información del libro en línea de Dangdang y escribirla en una tabla csv:

from bs4 import BeautifulSoup
import requests
import csv


def get_all_books():  # 获取每本书的连接URL
    '''
        获取该页面所有符合要求的图书的连接
    '''
    url = 'http://search.dangdang.com/?key=Python&act=input'
    book_list = []
    r = requests.get(url, timeout=30)
    soup = BeautifulSoup(r.text, 'lxml')

    book_ul = soup.find_all('ul', {
    
    'class': 'bigimg'})
    book_ps = book_ul[0].find_all('p', {
    
    'class': 'name', 'name': 'title'})
    for book_p in book_ps:
        book_a = book_p.find('a')
        book_url = 'http:'+book_a.get('href')  # 对应详细信息的页面链接URL,需要'http:'
        book_title = book_a.get('title')  # 书名
        book_list.append(book_url)

    return book_list


def get_information(book_url):
    '''
        获取每本书籍的信息
    '''
    print(book_url)
    headers = {
    
    
        'User-Agent': 'MMozilla/5.0(Windows NT 6.1; WOW64; rv:31.0) Gecko/20200201 Firefox/31.0'}
    r = requests.get(book_url, headers=headers)
    soup = BeautifulSoup(r.text, 'lxml')
    book_info = []

    # 获取书籍名称
    div_name = soup.find('div', {
    
    'class': 'name_info', 'ddt-area': '001'})
    h1 = div_name.find('h1')
    book_name = h1.get('title')
    book_info.append(book_name)

    # 获取书籍作者
    div_author = soup.find('div', {
    
    'class': 'messbox_info'})
    span_author = div_author.find('span', {
    
    'class': 't1', 'dd_name': '作者'})
    book_author = span_author.text.strip()[3:]
    book_info.append(book_author)

    # 获取书籍出版社
    div_press = soup.find('div', {
    
    'class': 'messbox_info'})
    span_press = div_press.find('span', {
    
    'class': 't1', 'dd_name': '出版社'})
    book_press = span_press.text.strip()[4:]
    book_info.append(book_press)

    # 获取书籍价钱
    div_price = soup.find('div', {
    
    'class': 'price_d'})
    book_price = div_price.find('p', {
    
    'id': 'dd-price'}).text.strip()
    book_info.append(book_price)

    return book_info


def main():
    header = ['书籍名称', '作者', '出版社', '当前价钱']
    # 文件操作
    with open('Python_book_info.csv', 'w', encoding='utf-8') as f:
        writer = csv.writer(f)
        writer.writerow(header)
        books = get_all_books()
        for i, book in enumerate(books):
            if i % 10 == 0:
                print('获取了{}条信息,一共{}条信息'.format(i, len(books)))
            l = get_information(book)
            writer.writerow(l)


if __name__ == '__main__':
    main()


Al final fue anti-escalada, pero es gratificante recopilar la información , que demuestra que la práctica es exitosa.

Por favor agregue una descripción de la imagen.


Por favor agregue una descripción de la imagen.

  Hice una pequeña introducción a los reptiles durante las vacaciones de verano y completé algunos pequeños proyectos con referencia al libro "Python Reptile Super Detail Practical Raiders" de Xia Agile. Todavía estoy muy feliz, así que compartiré algunas partes seleccionadas aquí.

Supongo que te gusta

Origin blog.csdn.net/weixin_47305073/article/details/126732940
Recomendado
Clasificación