Proceso de aprendizaje de solicitudes de Xiaojie + rastreo de imagen de barra de publicación xpath

Este blog describe cómo rastrear imágenes de Baidu Post Bar. Usando las solicitudes más básicas de la tecnología del rastreador más la extracción de la ubicación xpath.

Escribí este reptil porque hay muchas calcomanías e imágenes, como emoticones. Me gusta tener las imágenes adentro, pero si las guarda una por una, será demasiado lento. Así nació este reptil.

Estoy tratando de rastrear cualquier imagen de Post Bar, por lo que la primera página para ingresar es definitivamente la página principal de Baidu Post Bar.

https://tieba.baidu.com/

Luego, de manera casual, ingreso el nombre de una barra de publicación, uso el paquete de emoji como ejemplo (quién lo llama más fotos).

Luego ingrese el paquete de emoji, su URL es: https://tieba.baidu.com/f?ie=utf-8&kw=%E8%A1%A8%E6%83%85%E5%90%A7&fr= buscar

Regreso a la página de inicio y solo ingreso una publicación, esta vez entro al rastreador de Python.

Su URL es: https://tieba.baidu.com/f?ie=utf-8&kw=Python%E7%88%AC%E8%99%AB&fr=search

Descubrí que estas dos URL solo son diferentes en su atributo kw, y la página web transcodificará automáticamente el chino que ingresé. Luego intenté acortar la URL y descubrí que puedo eliminar la siguiente & fr = buscar y solicitarla. Para que pueda obtener la URL que solicita la información en la publicación: https://tieba.baidu.com/f?ie=utf-8&kw= (el nombre de la barra que desea rastrear, no traiga la palabra "barra").

Luego analizo la página de publicación específica, necesito ingresar cada publicación y solo necesito imágenes, así que solo necesito obtener el enlace de cada publicación.

F12 ingresa al modo desarrollador, localizo arbitrariamente una publicación, puedo encontrar:

<a rel="noreferrer" href="/p/5788129292" title="【表情吧官方群】欢迎大家加入!" target="_blank" class="j_th_tit ">【表情吧官方群】欢迎大家加入!</a>

Luego ingrese esta publicación para ver su URL: https://tieba.baidu.com/p/5788129292

Se encontró que el contenido de la segunda mitad de su contenido está en el atributo @href anterior, por lo que extraje el elemento href y luego agregué "https://tieba.baidu.com" delante de él para ingresar a cada publicación. Abajo pruebo:

import requests  
from lxml import etree  #要用xpath需要导入的
from my_fake_useragent import UserAgent    #随机请求头的一个包
def get_one_page(url):
    headers = {
        'User-Agent': UserAgent().random(),
        'Referer': 'https: // tieba.baidu.com / index.html',
    }
    base = 'https://tieba.baidu.com'
    response = requests.get(url, headers).text
    html = etree.HTML(response)
    link_list = html.xpath('//ul[@id="thread_list"]//a[@rel="noreferrer"and@class="j_th_tit "]/@href')
    link_list = map(lambda link: base + link, link_list)
    for link in link_list:
        print(link)


def main():
    url = 'https://tieba.baidu.com/f?ie=utf-8&kw=%E8%A1%A8%E6%83%85%E5%90%A7'
    get_one_page(url)


if __name__ == '__main__':
    main()

 

La parte de salida:

C:\Users\User\AppData\Local\Programs\Python\Python37\python.exe G:/Python/code/requeats/try.py
https://tieba.baidu.com/p/5788129292
https://tieba.baidu.com/p/4789404681
https://tieba.baidu.com/p/6478509408
https://tieba.baidu.com/p/6497831229
https://tieba.baidu.com/p/6497828481
……

Aquí quiero recomendar un paquete, el paquete my_fake_useragent anterior, este paquete devuelve un User-Agent al azar, para que no tenga que trabajar duro para construir un grupo de User-Agent. Si desea instalarlo, simplemente instale fake_useragent, por qué es my_fake_useragent, porque lo descargué al comienzo de pycharm, por lo que todos deberían usar fake_useragent.

Y la prueba de referencia en mi encabezado anterior se puede solicitar sin agregar, pero si rastrea mucho, es inevitable verificar, por lo que cuantos más parámetros escriban los encabezados, mejor.

Volviendo a la pregunta original, extraje la URL de cada publicación y necesito ingresar cada publicación para rastrear imágenes.

Debido a que quiero encontrar la regla del bloque donde se encuentra la imagen, tengo que ingresar una publicación con al menos dos o tres imágenes y anuncios, y no quiero anunciar imágenes.

Luego ingresé: https://tieba.baidu.com/p/6299996178

Descubriré que esta publicación tiene muchas imágenes, necesitamos encontrar imágenes en diferentes áreas para asegurarme de que estoy buscando un patrón general.

La primera foto

<cc>            <div class="j_ueg_post_content p_forbidden_tip" style="display:none;">该楼层疑似违规已被系统折叠&nbsp;<a rel="noopener" href="###" class="p_forbidden_post_content_unfold" style="display:;">隐藏此楼</a><a rel="noopener" href="###" class="p_forbidden_post_content_fold" style="display:none;">查看此楼</a></div><div id="post_content_127945257402" class="d_post_content j_d_post_content " style="display:;">            长更,图源各处,自己搜集<br><img class="BDE_Image" src="https://imgsa.baidu.com/forum/w%3D580/sign=7015ef856381800a6ee58906813533d6/8a274b90f603738d083a1a28bc1bb051f819ec6a.jpg" size="52322" changedsize="true" width="560" height="560"><br><img class="BDE_Image" src="https://imgsa.baidu.com/forum/w%3D580/sign=cf7758d65be736d158138c00ab514ffc/b2ed38dbb6fd5266a76f2a1ea418972bd407361d.jpg" size="44412" changedsize="true" width="560" height="560"><br><img class="BDE_Image" src="https://imgsa.baidu.com/forum/w%3D580/sign=4d6f86f8721ed21b79c92eed9d6fddae/500163d0f703918f6a172ac05e3d269758eec498.jpg" size="11218" width="240" height="240"><br><img class="BDE_Image" src="https://imgsa.baidu.com/forum/w%3D580/sign=c3ee0de7accc7cd9fa2d34d109012104/97e47c1ed21b0ef474948e54d2c451da81cb3e65.jpg" size="28050" width="482" height="360"><br><img class="BDE_Image" src="https://imgsa.baidu.com/forum/w%3D580/sign=7d835c046809c93d07f20effaf3cf8bb/14599f2f07082838aba4ca1eb799a9014c08f131.jpg" size="79960" changedsize="true" width="560" height="479"></div><br>                        </cc>

La segunda imagen, de otra respuesta:

<cc>            <div class="j_ueg_post_content p_forbidden_tip" style="display:none;">该楼层疑似违规已被系统折叠&nbsp;<a rel="noopener" href="###" class="p_forbidden_post_content_unfold" style="display:;">隐藏此楼</a><a rel="noopener" href="###" class="p_forbidden_post_content_fold" style="display:none;">查看此楼</a></div><div id="post_content_127945275558" class="d_post_content j_d_post_content " style="display:;">            <img class="BDE_Image" src="https://imgsa.baidu.com/forum/w%3D580/sign=731151b14810b912bfc1f6f6f3fdfcb5/2eb30b7b02087bf4b4d141e3fdd3572c11dfcfa5.jpg" size="73764" changedsize="true" width="560" height="560"></div><br>                        </cc>

 

Publicidad:

<div class="middle_image_content">
                    <a class="j_click_stats img_wrap" target="_blank" href="https://www.baidu.com/baidu.php?url=a00000jCx3p_KaPSJbxITB8iy2YQnH0i7MPwHjhCd4ZW9ROunXB4q7Su9mrP0PSLdibjxpor5i3bIc2IP5qPh0nU2MvXtTJEod0U44YTogcAYwcHPHbNGdATM7kr_jUPIVgfYjcKf7HG5NcuGhv1CkXAXAGu4U10zIYrxGx9O6kXpFI9h4or8i76wHQqj_kpvXFN1sVGIjqq7JXKDF7yYiv64_fk.7D_NR2Ar5Od66ux4g_3_ac2ampCPUn2XqauhZVm9kOSoQqpRLxOOqh5gOl33xOOS1ZWOqx1xjMhH7wX17ZRSqlTOsOhSZOOO_k35OyunN7enRIHeLG1lZmrW017MlZ4Eu6zxOOqbQOOgOOO_eXjOdo__o_vyUdBmSoG_A-muCyn--xuER0.U1Yk0ZDqdVj01tHJEUEHYfKY5ULnYOL73PAd0A-V5HRkn0KM5fKdpHY0TA-b5Hc30APGujYznWb0UgfqnHmdnHR0mhnqnfKopHYs0ANGujYdnj03nWbv0AFG5fKVm1Y0TgKGujYs0Z7Wpyfqn0KzuLw9u1Ys0AqvUjYznWf3PzYkPdt1nj0snjDVn-t1n1f4nadbX-t1PHTdPadbX-t1rjRkPzYkg1fknj6LQywlg1fznWnzQH7xPjR1nHRVnNtYPHbvPBYs0A7B5HKxn0K-ThTqn0KsTjYs0A4vTjYsQW0snj0snj0s0AdYTjY0uAwETjY0ThCqn0K1XWY0IZN15HTvPHbknjnYnH0dPHc3Pjc1rHR0ThNkIjYkPH6krHb1PjbkrHTd0ZPGujYsPAcYuHD1uyDzPvc3nW010ZK85H00ULnqP0KVIZ-suHY10A7bIZ-suHYkrjT0mgwspyfqn0KWTA-b5HDsnjD0TAkGujYsnj0z0APCpyfq0A7sTZu85fKYmg6q0AdYT1YkPWRkPfKEmLKW5HDWnansc10Wnansc1cYPinWc1D8nj0sc1D8nj0scznWnansc1D8nj0Wcznsc10Wnansc10Wnansc1ndnansc10WnankQW0sc1D8nj0sc1D8nj0sc108nj0sc108nj0sc108nj0sc1D8nj0Wnansc10WnankQW0snansc10WnanWnansc100TZfqn1ndn1b0TAq1pgwGUv3qn0KsULPGIA-EU-qWpA78uvNxThN9Tvq85H00ULFGgvdY5HDvPHDd0AdYgLKY5H00myPWIjY0uAPWujY0uAPzTjY0uANvIZ0q0ZP85fKsThqb5fKEmLKWgvk9m-q1IA7YIgnqn0KEmLKWgvP_pyPo5H0Wnansc10Wnansc1D8nj0sc1D8nj0s0AuYXgK-5H00myw1U-q15H00myw1U-qGT1Y0mhd_5H00Uy7WPHY0UvDq0A7bmv_qn0K_IjYs0ZPW5H00Ih-buyqGujY0mhN1UjYs0A-1uAsqn0KEUAw_5H00TZFEuv7bIWYs0A71XHYs0A7bTZTqnHDYn0K9uZKC5HmYn0KGTL0quLGCXZb0pZP_u1Ys0jDqn00z5f015f0Y5f0d5H00PWYs0jTqn0035H00rHY0TZFEudqYT1YkP1m1rHbYPHR4n1DYrjR3nWnzn0KsThqMgLK15HbznjRdnHTYPHbYn1c1PHc4rjT0TZFEudqYpHYs0ZKzUvIxTAbq0ZKWpHYs0ZPJpjYzPHR0mMNYmyTqn0K8ugfqn0KWThnqnWD4Pjb" data-locate="pb_图片">
                        <img class="BDE_Image" src="https://aod-image-material.cdn.bcebos.com/5/pic/e49b173f4f765829e251b905696dc386.jpg" ad-dom-img="true">
                        
                    </a>
                    <div class="ad_bottom_view">
                        <span class="now_date">2020-02-18 10:38</span>
                        <span class="label_text"> 广告</span>
                    </div>
                </div>

 

Por el código HTML que intercepté aquí, puedo saber que la imagen que necesito está directamente en el atributo @src en la etiqueta img del atributo @ class = "BDE_Image debajo de la etiqueta CC.

Luego intenté rastrear las imágenes en la primera página de la respuesta de una publicación (un poco jaja).

import requests
from lxml import etree
from my_fake_useragent import UserAgent


def get_one_page(url):
    headers = {
        'User-Agent': UserAgent().random(),
        'Referer': 'https: // tieba.baidu.com / index.html',
    }
    base = 'https://tieba.baidu.com'
    response = requests.get(url, headers).text
    html = etree.HTML(response)
    link_list = html.xpath('//ul[@id="thread_list"]//a[@rel="noreferrer"and@class="j_th_tit "]/@href')
    link_list = map(lambda link: base + link, link_list)
    return link_list


def parse_one_page(link):
    headers = {
        'User-Agent': UserAgent().random(),
        'Cookie': '(填你自己的)',
    }
    imgs = []
    url = link
    response = requests.get(url, headers).text
    html = etree.HTML(response)
    img = html.xpath('//cc//img[@class="BDE_Image"]//@src')
    imgs.append(img)
    return imgs


def main():
    url = 'https://tieba.baidu.com/f?ie=utf-8&kw=%E8%A1%A8%E6%83%85%E5%90%A7'
    for page in get_one_page(url):
        for imgs in parse_one_page(page):
            for img in imgs:
                print(img)


if __name__ == '__main__':
    main()

 

La parte de salida:

C:\Users\User\AppData\Local\Programs\Python\Python37\python.exe G:/Python/code/requeats/try.py
https://imgsa.baidu.com/forum/w%3D580/sign=9fa533f53cadcbef01347e0e9caf2e0e/f0dbfd039245d6889b38b895a9c27d1ed21b24ea.jpg
https://imgsa.baidu.com/forum/w%3D580/sign=cdf24ef44ba98226b8c12b2fba83b97a/facc14ce36d3d5399036c3423287e950342ab0ca.jpg
http://tiebapic.baidu.com/forum/w%3D580/sign=d106bd7a4e82b2b7a79f39cc01accb0a/7436b812c8fcc3ceb3bfec4d8545d688d43f2072.jpg
http://tiebapic.baidu.com/forum/w%3D580/sign=7cbc896bab315c6043956be7bdb0cbe6/c8cbaa64034f78f06b74bf8d6e310a55b3191c72.jpg
http://tiebapic.baidu.com/forum/w%3D580/sign=6c8ab7c8de177f3e1034fc0540ce3bb9/92ad86d6277f9e2fba4a38760830e924b899f373.jpg
http://tiebapic.baidu.com/forum/w%3D580/sign=c8b5121def1986184147ef8c7aec2e69/81379213b07eca801e96ae9b862397dda04483e5.jpg
http://tiebapic.baidu.com/forum/w%3D580/sign=fc409f2142fbb2fb342b581a7f4b2043/ae30fcfaaf51f3de11212e1883eef01f3b2979e5.jpg
http://tiebapic.baidu.com/forum/w%3D580/sign=6b8fd58ab0efce1bea2bc8c29f50f3e8/ad770eb30f2442a722536bd9c643ad4bd1130217.jpg
http://tiebapic.baidu.com/forum/w%3D580/sign=0e1dfe512d292df597c3ac1d8c305ce2/b1245bafa40f4bfb611ea52a144f78f0f63618a3.jpg
http://tiebapic.baidu.com/forum/w%3D580/sign=43e7890afcf81a4c2632ecc1e72b6029/a17ed009b3de9c829e8cc2f17b81800a18d8438c.jpg
http://tiebapic.baidu.com/forum/w%3D580/sign=7b203fe3dcef76093c0b99971edca301/cf259345d688d43ff040aa8c6a1ed21b0ff43b8c.jpg
……

Entonces extraje la URL de cada imagen.

Entonces quiero agregar más operaciones para facilitar el control humano:

"¿Qué tipo de publicación desea rastrear? Ingrese el nombre de la publicación usted mismo. Por supuesto, si solo desea rastrear una determinada publicación, no necesita esto".

② Quiero rastrear algunas páginas de publicaciones, porque algunas tienen muchas imágenes. Si solo las usas para luchar contra las imágenes, no es necesario que rastree mucho, así que puedo establecer cuántas páginas rastrear y, por supuesto, establecer cuántas imágenes para detener El programa también es muy bueno.

③ Rastrear cada página de cada respuesta de publicación. Debido a que la calidad de las publicaciones es diferente, algunas publicaciones no tienen interés y algunas tienen innumerables imágenes, por lo que no puedo encontrar un valor apropiado para restringir todas las publicaciones, así que aquí extraigo cada publicación. El número total de páginas y luego use el número total de páginas para recorrer cada página y rastrear la respuesta.

④ Quiero extraer su nombre detrás de la URL de la imagen para guardar, aquí uso os.path.split bajo el paquete os. Por ejemplo: http://tiebapic.baidu.com/forum/w%3D580/sign=7b203fe3dcef76093c0b99971edca301/cf259345d688d43ff040aa8c6a1ed21b0ff43b8c.jpg. 1,2,3,4 se suman cuando el nombre de la imagen es muy bajo, y el nombre del sufijo de la imagen también es diferente, escribimos manualmente que es muy fácil cometer errores, como imágenes gif, si agrega jpg no se moverá, tales imágenes Sin sentido Entonces uso os.path.split para extraer directamente la segunda mitad de la imagen, lo cual es mucho más conveniente.

⑤ Para guardar la imagen, uso urlretrieve debajo de urllib, desde urllib.request import urlretrieve.

Todos los códigos:

import requests
from lxml import etree
from urllib.request import urlretrieve
from my_fake_useragent import UserAgent
import os


def get_one_page(url):
    headers = {
        'User-Agent': UserAgent().random(),
        'Referer': 'https: // tieba.baidu.com / index.html',
    }
    base = 'https://tieba.baidu.com'
    response = requests.get(url, headers).text
    html = etree.HTML(response)
    link_list = html.xpath('//ul[@id="thread_list"]//a[@rel="noreferrer"and@class="j_th_tit "]/@href')
    link_list = map(lambda link: base + link, link_list)
    return link_list
    # for link in link_list:
    #     print(link)


def parse_one_page(link):
    headers = {
        'User-Agent': UserAgent().random(),
        'Cookie': '(填你自己的)',
    }
    imgs = []
    url = link + "?pn=1"
    response = requests.get(url, headers).text
    html = etree.HTML(response)
    maxnumber = html.xpath('//li[@class="l_reply_num"]/span[2]/text()')[0]
    for i in range(1, int(maxnumber) + 1):
        try:
            url = link + "?pn={}".format(i)
            response = requests.get(url, headers).text
            html = etree.HTML(response)
            img = html.xpath('//cc//img[@class="BDE_Image"]//@src')
            imgs.append(img)
        except:
            break
    return imgs


def main():
    print('该爬虫功能为百度贴吧图片爬取!!!')
    kw = input('请输入所需爬取贴吧名:')
    number = input('请输入所需爬页数:')
    j = 1
    for i in range(int(number)):
        url = 'https://tieba.baidu.com/f?kw=' + kw + '&ie=utf-8&pn={}'.format(i * 50)
        try:
            for page in get_one_page(url):
                print(page)
                for imgs in parse_one_page(page):
                    for img in imgs:
                        print('正在保存第' + str(j) + '张图片。')
                        suffix = os.path.split(img)[1]
                        urlretrieve(img, 'C:\\Users\\User\\Desktop\\图片\\' + kw + '\\' + str(suffix))
                        j += 1
        except:
            break
    print('保存完毕!')


if __name__ == '__main__':
    main()

 

Aquí uso mi propia cookie, agregue la suya si desea usarla. Lo que guardé es una carpeta en el escritorio, al guardar, generará cuántas páginas se guardan. Por supuesto, debido a que uso las imágenes yo mismo, no es necesario para el trabajo, así que no uso el subproceso múltiple para escribir. Todos pueden agregar subprocesos múltiples si es necesario.

La parte de salida:

C:\Users\User\AppData\Local\Programs\Python\Python37\python.exe G:/Python/code/requeats/tieba.py
该爬虫功能为百度贴吧图片爬取!!!
请输入所需爬取贴吧名:表情包
请输入所需爬页数:1
https://tieba.baidu.com/p/6416580758
正在保存第1张图片。
正在保存第2张图片。
正在保存第3张图片。
正在保存第4张图片。
正在保存第5张图片。
正在保存第6张图片。
正在保存第7张图片。
正在保存第8张图片。
正在保存第9张图片。
正在保存第10张图片。
正在保存第11张图片。
……
……
……

 

El siguiente es el resultado del rastreo: una página de publicaciones rastreó más de 2,000, lo que muestra la salida de emoticones.

Inserte la descripción de la imagen aquí

Publicado 10 artículos originales · elogiado 0 · visitas 53

Supongo que te gusta

Origin blog.csdn.net/z55947810/article/details/105583431
Recomendado
Clasificación