Rastreador de Python 9: combate real 2

Rastreador de Python 9: combate real 2

prefacio

Es muy sencillo implementar un rastreador web en Python, solo necesita dominar ciertos conocimientos básicos y ciertas habilidades de uso de la biblioteca. El propósito de esta serie es clasificar los puntos de conocimiento relevantes para una revisión futura.

afirmar

El código involucrado en esta serie es solo para investigación y discusión personal, y no tendrá un impacto negativo en el sitio web.

Estructura de directorios

1. Objetivo

​ Este rastreador de combate real, la biblioteca utilizada es:, requests + bs4esta vez el caso proviene de python爬虫7:实战1este artículo, el punto principal esta vez es usar bs4 para el análisis, por lo tanto, te sugiero que lo leas primero, python爬虫7:实战1porque copiaré directamente el código dentro. y usarlo.

Una vez más , el caso en sí no es importante, lo importante es cómo usarlo y analizarlo, y para evitar problemas como infracciones, no publicaré imágenes relacionadas con el sitio web, espero que lo entiendas .

2. Proceso detallado

2.1 Requisitos previos

Dado que no es necesario reescribir la mayor parte del código, este artículo explica principalmente cómo usar bs4 para analizar páginas web.

​ Copia el código anterior aquí:

# 导包
import requests
from lxml import etree

# 都要用到的参数
HEADERS = {
    
    
    'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
}

# 获取搜索某小说后的页面
def get_search_result():
    # 网址
    url = 'https://www.iwurexs.net/so.html'
    # 请求参数
    search = input('请输入想要搜索的小说:')
    params = {
    
    
        'q' : search
    }
    # 请求
    response = requests.get(url,headers=HEADERS,params=params)
    # 把获取到的网页保存到本地
    with open('search.html', 'w', encoding='utf-8') as f:
        f.write(response.content.decode('utf-8'))

# 解析网页
def parse_search_result():
    # 打开文件,读取文件
    with open('search.html', 'r', encoding='utf-8') as f:
        content = f.read()
        # 基础url
        base_url = 'https://www.iwurexs.net/'
        # 初始化lxml
        html = etree.HTML(content)
        # 获取目标节点
        href_list = html.xpath('//div[@class="show"]//table[@class="grid"]//td//a/@href')
        text_list = html.xpath('//div[@class="show"]//table[@class="grid"]//td//a/text()')
        # 处理内容值
        url_list = [base_url+href  for href in href_list]
        # 选择要爬取的小说
        for i,text in enumerate(text_list):
            print('当前小说名为:',text)
            decision = input('是否爬取它(只能选择一本),Y/N:')
            if decision == 'Y':
                return url_list[i],text

# 请求目标小说网站
def get_target_book(url):
    # 请求
    response = requests.get(url,headers=HEADERS)
    # 保存源码
    with open('book.html', 'w', encoding='utf-8') as f:
        f.write(response.content.decode('utf-8'))

# 解析章节网页
def parse_chapter(base_url):
    # 打开文件,读取内容
    with open('book.html', 'r', encoding='utf-8') as f:
        content = f.read()
        # 初始化
        html = etree.HTML(content)
        # 解析
        href_list = html.xpath('//div[@class="show"]//div[contains(@class,"showBox") and position()=3]//ul//a/@href')
        text_list = html.xpath('//div[@class="show"]//div[contains(@class,"showBox") and position()=3]//ul//a/text()')
        # 处理:拼凑出完整网页
        url_list = [base_url+url for url in href_list]
        # 返回结果
        return url_list,text_list

# 请求小说页面
def get_content(url,title):
    # 请求
    response = requests.get(url,headers=HEADERS)
    # 获取源码
    content = response.content.decode('utf-8')
    # 初始化
    html = etree.HTML(content)
    # 解析
    text_list = html.xpath('//div[contains(@class,"book")]//div[@id="content"]//text()')
    # 后处理
    # 首先,把第一个和最后一个的广告信息去掉
    text_list = text_list[1:-1]
    # 其次,把里面的空白字符和\xa0去掉
    text_list = [text.strip().replace('\xa0','') for text in text_list]
    # 最后,写入文件即可
    with open(title+'.txt','w',encoding='utf-8') as g:
        for text in text_list:
            g.write(text+'\n')

if __name__ == '__main__':
    # 第一步,获取到搜索页面的源码
    # get_search_result()
    # 第二步,进行解析
    target_url,name = parse_search_result()
    # 第三步,请求目标小说页面
    get_target_book(target_url)
    # 第四步,解析章节网页
    url_list,text_list = parse_chapter(target_url)
    for url,title in zip(url_list,text_list):
        # 第五步,请求小说具体的某个章节并直接解析
        get_content(url,title)
        break

​ Las partes que es necesario modificar son: 三个解析函数.

2.2 Modificación 1: Modificación de la función de análisis de adquisición de novelas objetivo

​ El nombre de la función que se modificará esta vez parse_search_result.

​ Luego, mira la imagen a continuación:

inserte la descripción de la imagen aquí

​ Luego, podemos encontrar aetiquetas como esta:

1. 找到table标签,其class="grid"
2. 找到table下的a标签即可

​ Luego, el código se modifica de la siguiente manera:

# 解析网页
def parse_search_result():
    # 打开文件,读取文件
    with open('search.html', 'r', encoding='utf-8') as f:
        content = f.read()
        # 基础url
        base_url = 'https://www.iwurexs.net/'
        # 初始化lxml
        soup = BeautifulSoup(content,'lxml')
        # 获取目标节点
        a_list = soup.find_all('table',attrs={
    
    'class':'grid'})[0].find_all('a')
        url_list = [base_url + a['href'] for a in a_list]
        text_list = [a.string for a in a_list]
        # 选择要爬取的小说
        for i,text in enumerate(text_list):
            print('当前小说名为:',text)
            decision = input('是否爬取它(只能选择一本),Y/N:')
            if decision == 'Y':
                return url_list[i],text

​ El resultado de la operación es el siguiente:

inserte la descripción de la imagen aquí

2.3 Modificación 2: Modificación de la función de análisis de adquisición del catálogo de capítulos

​ El nombre de la función que se modificará esta vez parse_chapter.

En primer lugar, mira la imagen a continuación:

inserte la descripción de la imagen aquí

Luego, se puede analizar así:

1. 首先,获取所有含有class="showBox"的div标签,共三个,但是我们只要第三个
2. 其次,获取该div下的所有a标签即可

​ Luego, el código se modifica de la siguiente manera:

# 解析章节网页
def parse_chapter(base_url):
    # 打开文件,读取内容
    with open('book.html', 'r', encoding='utf-8') as f:
        content = f.read()
        # 初始化
        soup = BeautifulSoup(content,'lxml')
        # 解析
        # 获取最后一个div标签
        div_label = soup.find_all('div',attrs={
    
    'class':'showBox'})[-1]
        # 获取所有a标签
        a_list = div_label.find_all('a')
        # 获取内容
        url_list = [base_url+a['href'] for a in a_list]
        text_list = [a.string for a in a_list]
        # 返回结果
        return url_list,text_list

​ El resultado de la operación es el siguiente:

inserte la descripción de la imagen aquí

2.4 Modificación 3: Modificación de la función de análisis de contenido novedoso

​ El nombre de la función que se modificará esta vez get_content.

En primer lugar, mira la imagen a continuación:

inserte la descripción de la imagen aquí

Luego, se puede analizar así:

1. 直接获取id=“content”的div标签
2. 在获取其下的所有内容

​ Luego, modifica el código de la siguiente manera:

# 请求小说页面
def get_content(url,title):
    # 请求
    response = requests.get(url,headers=HEADERS)
    # 获取源码
    content = response.content.decode('utf-8')
    # 初始化
    soup = BeautifulSoup(content,'lxml')
    # 解析
    text_list = list(soup.find_all('div',attrs={
    
    'id':'content'})[0].stripped_strings)
    # 后处理
    # 首先,把第一个和最后一个的广告信息去掉
    text_list = text_list[1:-1]
    # 其次,把里面的空白字符和\xa0去掉
    text_list = [text.strip().replace('\xa0','') for text in text_list]
    # 最后,写入文件即可
    with open(title+'.txt','w',encoding='utf-8') as g:
        for text in text_list:
            g.write(text+'\n')

El resultado final de la ejecución es el siguiente:

inserte la descripción de la imagen aquí

2.5 Código completo:

# 导包
import requests
from bs4 import BeautifulSoup


# 都要用到的参数
HEADERS = {
    
    
    'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
}

# 获取搜索某小说后的页面
def get_search_result():
    # 网址
    url = 'https://www.iwurexs.net/so.html'
    # 请求参数
    search = input('请输入想要搜索的小说:')
    params = {
    
    
        'q' : search
    }
    # 请求
    response = requests.get(url,headers=HEADERS,params=params)
    # 把获取到的网页保存到本地
    with open('search.html', 'w', encoding='utf-8') as f:
        f.write(response.content.decode('utf-8'))

# 解析网页
def parse_search_result():
    # 打开文件,读取文件
    with open('search.html', 'r', encoding='utf-8') as f:
        content = f.read()
        # 基础url
        base_url = 'https://www.iwurexs.net/'
        # 初始化lxml
        soup = BeautifulSoup(content,'lxml')
        # 获取目标节点
        a_list = soup.find_all('table',attrs={
    
    'class':'grid'})[0].find_all('a')
        url_list = [base_url + a['href'] for a in a_list]
        text_list = [a.string for a in a_list]
        # 选择要爬取的小说
        for i,text in enumerate(text_list):
            print('当前小说名为:',text)
            decision = input('是否爬取它(只能选择一本),Y/N:')
            if decision == 'Y':
                return url_list[i],text


# 请求目标小说网站
def get_target_book(url):
    # 请求
    response = requests.get(url,headers=HEADERS)
    # 保存源码
    with open('book.html', 'w', encoding='utf-8') as f:
        f.write(response.content.decode('utf-8'))

# 解析章节网页
def parse_chapter(base_url):
    # 打开文件,读取内容
    with open('book.html', 'r', encoding='utf-8') as f:
        content = f.read()
        # 初始化
        soup = BeautifulSoup(content,'lxml')
        # 解析
        # 获取最后一个div标签
        div_label = soup.find_all('div',attrs={
    
    'class':'showBox'})[-1]
        # 获取所有a标签
        a_list = div_label.find_all('a')
        # 获取内容
        url_list = [base_url+a['href'] for a in a_list]
        text_list = [a.string for a in a_list]
        # 返回结果
        return url_list,text_list

# 请求小说页面
def get_content(url,title):
    # 请求
    response = requests.get(url,headers=HEADERS)
    # 获取源码
    content = response.content.decode('utf-8')
    # 初始化
    soup = BeautifulSoup(content,'lxml')
    # 解析
    text_list = list(soup.find_all('div',attrs={
    
    'id':'content'})[0].stripped_strings)
    # 后处理
    # 首先,把第一个和最后一个的广告信息去掉
    text_list = text_list[1:-1]
    # 其次,把里面的空白字符和\xa0去掉
    text_list = [text.strip().replace('\xa0','') for text in text_list]
    # 最后,写入文件即可
    with open(title+'.txt','w',encoding='utf-8') as g:
        for text in text_list:
            g.write(text+'\n')

if __name__ == '__main__':
    # 第一步,获取到搜索页面的源码
    # get_search_result()
    # 第二步,进行解析
    target_url,name = parse_search_result()
    # 第三步,请求目标小说页面
    get_target_book(target_url)
    # # 第四步,解析章节网页
    url_list,text_list = parse_chapter(target_url)
    for url,title in zip(url_list,text_list):
        # 第五步,请求小说具体的某个章节并直接解析
        get_content(url,title)
        break

3. Resumen

El objetivo principal de este combate real es ayudarte a familiarizarte con las habilidades de uso de la biblioteca bs4. El combate real es solo incidental. Saber cómo ejecutar esta herramienta es más importante que saber cómo rastrear un sitio web.

Además, no es difícil ver que la biblioteca lxml se parece más a un modo de posicionamiento de arriba a abajo. Si desea obtener una determinada etiqueta, primero debe considerar una etiqueta más específica en ella, mientras que bs4 es Más directo, si la etiqueta que desea obtener es especial y puede ubicarla directamente sin utilizar otras relaciones para determinarla .

​ El siguiente artículo comienza explicando cómo resolver páginas web dinámicas, es decir, la biblioteca de selenio.

Supongo que te gusta

Origin blog.csdn.net/weixin_46676835/article/details/132401169
Recomendado
Clasificación