Maison  >  Article  >  développement back-end  >  Explication détaillée de la méthode d'exploration vers l'Encyclopédie des choses embarrassantes à l'aide de la technologie d'exploration de Python

Explication détaillée de la méthode d'exploration vers l'Encyclopédie des choses embarrassantes à l'aide de la technologie d'exploration de Python

高洛峰
高洛峰original
2017-03-20 09:25:321227parcourir

C'était la première fois que j'apprenais la technologie des robots d'exploration. J'ai lu une blague sur Zhihu sur la façon d'explorer l'Encyclopédie des choses embarrassantes, alors j'ai décidé d'en créer une moi-même.

Atteignez vos objectifs : 1. Accédez aux blagues de l'Encyclopédie des choses embarrassantes

2. Parcourez un paragraphe à la fois et passez à la page suivante chaque fois que vous appuyez sur Entrée

Implémentation technique : basée sur l'implémentation de python, en utilisant la bibliothèque Requests, la bibliothèque re et la méthode BeautifulSoup de la bibliothèque bs4 pour implémenter

Contenu principal : Tout d'abord, nous devons Clarifions les idées d'implémentation de l'exploration, construisons le corps principalframework. Dans la première étape, nous écrivons d'abord une méthode pour obtenir des pages Web à l'aide de la bibliothèque Requests. Dans la deuxième étape, nous utilisons la méthode BeautifulSoup de la bibliothèque bs4 pour analyser les informations obtenues sur la page Web et utiliser des expressions régulières. pour correspondre aux informations du paragraphe pertinent. La troisième étape consiste à imprimer les informations obtenues. Nous exécutons tous les méthodes ci-dessus via une fonction principale .

1. Tout d'abord, importez les bibliothèques pertinentes

import requests
from bs4 import BeautifulSoup
import bs4
import  re

2. Tout d'abord, obtenez les informations de la page Web

def getHTMLText(url):
    try:
        user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
        headers = {'User-Agent': user_agent}
        r = requests.get(url,headers = headers)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ""

3. analysez-le

soup = BeautifulSoup(html,"html.parser")

Ce dont nous avons besoin, c'est du contenu et de l'éditeur de la blague. En consultant le code source sur la page Web, nous savons que l'éditeur de la blague est :

'p', attrs={'class': 'content'}中
<.>Le contenu de la blague est à

'p', attrs={'class': 'author clearfix'}中
Nous utilisons donc la méthode de la bibliothèque bs4 pour extraire le contenu spécifique de ces deux balises

def fillUnivlist(lis,li,html,count):
    soup = BeautifulSoup(html,"html.parser")
    try:
        a = soup.find_all('p', attrs={'class': 'content'})
        ll = soup.find_all('p', attrs={'class': 'author clearfix'})
puis obtenons l'information via des expressions régulières

for sp in a:
    patten = re.compile(r'<span>(.*?)</span>',re.S)
    Info = re.findall(patten,str(sp))
    lis.append(Info)
    count = count + 1
for mc in ll:
    namePatten = re.compile(r'<h2>(.*?)</h2>', re.S)
    d = re.findall(namePatten, str(mc))
    li.append(d)
Ce que nous devons noter, c'est que les méthodes find_all et re findall renvoient une liste Lorsque nous utilisons des expressions régulières, nous extrayons seulement grossièrement et ne supprimons pas les sauts de ligne dans les balises

.

Ensuite, il suffit d'ajouter 2. Il suffit de combiner le contenu des listes et de les afficher

def printUnivlist(lis,li,count):
    for i in range(count):
        a = li[i][0]
        b = lis[i][0]
        print ("%s:"%a+"%s"%b)
Ensuite, je crée une fonction de contrôle d'entrée, entrez Q pour renvoyer une erreur, quittez, entrez Entrée pour revenir corriger, et charger la page suivante des paragraphes

def input_enter():
    input1 = input()
    if input1 == 'Q':
        return False
    else:
        return True
Nous réalisons le contrôle d'entrée via la fonction principale. Si la fonction de contrôle renvoie une erreur, la sortie ne sera pas exécutée. Si le retour est correct, le. la sortie continuera. Nous utilisons une

boucle for pour charger la page suivante.

def main():
    passage = 0
    enable = True
    for i in range(20):
        mc = input_enter()
        if mc==True:
            lit = []
            li = []
            count = 0
            passage = passage + 1
            qbpassage = passage
            print(qbpassage)
            url = 'http://www.qiushibaike.com/8hr/page/' + str(qbpassage) + '/?s=4966318'
            a = getHTMLText(url)
            fillUnivlist(lit, li, a, count)
            number = fillUnivlist(lit, li, a, count)
            printUnivlist(lit, li, number)
        else:
            break
Ici, nous devons noter que lis[] et li[] seront actualisés à chaque fois que la boucle for est exécutée, afin que le contenu du paragraphe de la page Web puisse être correctement affiché à chaque fois

Voici le code source :

import requests
from bs4 import BeautifulSoup
import bs4
import  re
def getHTMLText(url):
    try:
        user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
        headers = {'User-Agent': user_agent}
        r = requests.get(url,headers = headers)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ""
def fillUnivlist(lis,li,html,count):
    soup = BeautifulSoup(html,"html.parser")
    try:
        a = soup.find_all('p', attrs={'class': 'content'})
        ll = soup.find_all('p', attrs={'class': 'author clearfix'})
        for sp in a:
            patten = re.compile(r'(.*?)',re.S)
            Info = re.findall(patten,str(sp))
            lis.append(Info)
            count = count + 1
        for mc in ll:
            namePatten = re.compile(r'

(.*?)

', re.S)             d = re.findall(namePatten, str(mc))             li.append(d)     except:         return ""     return count def printUnivlist(lis,li,count):     for i in range(count):         a = li[i][0]         b = lis[i][0]         print ("%s:"%a+"%s"%b) def input_enter():     input1 = input()     if input1 == 'Q':         return False     else:         return True def main():     passage = 0     enable = True     for i in range(20):         mc = input_enter()         if mc==True:             lit = []             li = []             count = 0             passage = passage + 1             qbpassage = passage             print(qbpassage)             url = 'http://www.qiushibaike.com/8hr/page/' + str(qbpassage) + '/?s=4966318'             a = getHTMLText(url)             fillUnivlist(lit, li, a, count)             number = fillUnivlist(lit, li, a, count)             printUnivlist(lit, li, number)         else:             break main()
C'est la première fois que je le fais et il y a encore de nombreux domaines qui peuvent être optimisés. J'espère que vous pourrez le signaler.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn