Processo de aprendizado de solicitações de Xiaojie + rastreamento de imagem xpath post bar

Este blog descreve como rastrear fotos da Baidu Post Bar. Usando as solicitações mais básicas da tecnologia de rastreador, além da extração de localização do xpath.

Escrevi este réptil porque há muitos adesivos e figuras, como emoticons.Eu gosto de colocar as fotos dentro, mas se você as salvar uma a uma, será muito lento. Então este réptil nasceu.

Estou tentando rastrear qualquer imagem da barra de postagens, portanto a primeira página a entrar é definitivamente a página principal da barra de post do Baidu.

https://tieba.baidu.com/

Então, casualmente, insiro o nome de uma barra de postagem, uso o pacote emoji como exemplo (quem o chama de mais fotos).

Em seguida, insira o pacote emoji, o URL dele é: https://tieba.baidu.com/f?ie=utf-8&kw=%E8%A1%A8%E6%83%85%E5%90%A7&fr= pesquisar

Volto à página inicial e basta inserir uma postagem, desta vez entre no rastreador Python.

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

Descobri que esses dois URLs são apenas diferentes em seu atributo kw, e a página da Web transcodifica automaticamente o chinês que inseri. Tentei diminuir o URL e descobri que posso remover a seguinte pesquisa & fr = e solicitá-la. Para que eu possa obter o URL que solicita as informações na postagem: https://tieba.baidu.com/f?ie=utf-8&kw= (o nome da barra que você deseja rastrear, não traga a palavra "barra").

Depois, analiso a página específica da postagem, preciso inserir cada postagem e preciso apenas de imagens, então só preciso obter o link de cada postagem.

F12 entra no modo de desenvolvedor, arbitrariamente localize uma postagem, posso encontrar:

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

Em seguida, insira este post para ver seu URL: https://tieba.baidu.com/p/5788129292

Verificou-se que o conteúdo da segunda metade do conteúdo dele está no atributo @href acima, então extraí o elemento href e adicionei "https://tieba.baidu.com" na frente dele para inserir cada postagem. Abaixo eu testei:

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()

 

A parte de saída:

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
……

Aqui, eu quero recomendar um pacote, o pacote my_fake_useragent acima, esse pacote retorna um User-Agent aleatoriamente, para que eu não precise trabalhar duro para criar um pool de User-Agent. Se você deseja instalá-lo, basta instalar o fake_useragent, por que esse é my_fake_useragent, porque foi o que baixei no início do pycharm, para que todos usem fake_useragent.

E o teste do referenciador no meu cabeçalho acima pode ser solicitado sem adicionar, mas se você rastrear muito, é inevitável verificar, portanto, quanto mais parâmetros os cabeçalhos escreverem, melhor.

De volta à pergunta original, extraí o URL de cada postagem e preciso inseri-la para rastrear fotos.

Como quero encontrar a regra do bloco em que a imagem está localizada, preciso inserir uma postagem com pelo menos duas ou três fotos e anúncios, e não quero anunciar fotos.

Então entrei: https://tieba.baidu.com/p/6299996178

Vou achar que este post tem muitas fotos, precisamos encontrar fotos em diferentes áreas para garantir que eu esteja procurando um padrão geral.

A primeira 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>

A segunda foto, de outra resposta:

<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>

 

Publicidade:

<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>

 

Pelo código HTML que interceptei aqui, posso saber que a imagem necessária está diretamente no atributo @src na tag img do atributo @ class = "BDE_Image sob a tag CC.

Então tentei rastrear as imagens na primeira página da resposta de uma postagem (um pouco haha).

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()

 

A parte de saída:

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
……

Então eu extraí o URL de cada imagem.

Quero adicionar mais operações para facilitar o controle humano:

"Que tipo de postagem você deseja rastrear? Digite o nome da postagem. É claro que, se você deseja rastrear uma determinada postagem, não precisa disso.

② Quero rastrear algumas páginas de postagens, porque algumas têm muitas fotos. Se você as usa apenas para fotos de combate, não é necessário rastrear muito, para que eu possa definir quantas páginas rastrear e, é claro, definir quantas fotos parar O programa também é muito bom.

③ Rastreie cada página de cada resposta de postagem. Como a qualidade das postagens é diferente, algumas são desinteressadas e outras têm inúmeras fotos. Portanto, não encontro um valor apropriado para restringir todas as postagens. Por isso, aqui extrairei cada postagem O número total de páginas e use o número total de páginas para percorrer cada página para rastrear a resposta.

Extract Quero extrair o nome dele por trás da URL da imagem para salvar, aqui uso o os.path.split no pacote os. Por exemplo: http://tiebapic.baidu.com/forum/w%3D580/sign=7b203fe3dcef76093c0b99971edca301/cf259345d688d43ff040aa8c6a1ed21b0ff43b8c.jpg Esta imagem, quando eu a salvo, seu nome é cf2593ff0a08a1 1,2,3,4 se somam quando o nome da imagem é muito baixo e o nome do sufixo da imagem também é diferente, escrevemos manualmente que é muito fácil cometer erros, como imagens gif, se você adicionar jpg, ele não se moverá, tais imagens Sem sentido. Então, eu uso o os.path.split para extrair diretamente a segunda metade da imagem, o que é muito mais conveniente.

Save Para salvar a imagem, eu uso urlretrieve em urllib, em urllib.request import urlretrieve.

Todos os 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()

 

Aqui eu uso meu próprio cookie, adicione o seu próprio se você quiser usá-lo. O que eu salvei é uma pasta na área de trabalho; ao salvar, ela gera quantas páginas são salvas. Obviamente, como eu mesmo uso as imagens, não é necessário trabalhar, portanto não uso multithreading para escrever.Todos podem adicionar multithreading, se necessário.

A parte de saída:

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张图片。
……
……
……

 

A seguir, o resultado do rastreamento: Uma página de postagens rastreava mais de 2.000, mostrando a saída de emoticons.

Insira a descrição da imagem aqui

Publicado 10 artigos originais · elogiado 0 · visitas 53

Acho que você gosta

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