Maison > développement back-end > Tutoriel Python > Crawler Python pour les débutants : blagues d'exploration

Crawler Python pour les débutants : blagues d'exploration

巴扎黑
Libérer: 2017-06-23 16:28:58
original
1380 Les gens l'ont consulté

J'ai récemment commencé à apprendre les robots Python sur ce blog. Le blogueur utilise Python version 2.7, alors que j'utilise la version 3.5. Il y a de nombreuses incompatibilités, mais cela n'a pas d'importance. .

Nous souhaitons filtrer le contenu du site et n'obtenir que les parties qui nous intéressent. Par exemple, vous souhaitez filtrer les images pornographiques sur le site Web XX et les regrouper. Ici, nous ne faisons qu'une implémentation simple, en prenant comme exemple la blague (texte brut) écrite par sœur Bai Sibu. Nous souhaitons implémenter les fonctions suivantes :

  • Téléchargement par lots de plusieurs pages de paragraphes dans des fichiers locaux

  • Appuyez sur n'importe quelle touche pour démarrer la lecture le paragraphe suivant

1. Obtenez le code de la page Web

et importez la bibliothèque associée de urllib En Python 3, il doit être écrit comme. ceci :

import urllib.requestimport urllib.parseimport re
Copier après la connexion

re bibliothèque est une expression régulière (Regular Expression), qui sera utilisée plus tard pour la correspondance.

Page de blague de Bai Si Bu Si url ='http://www.budejie.com/text/1', le chiffre 1 à la fin ici signifie que c'est la première page. Le code suivant peut renvoyer le contenu de la page Web.

    req = urllib.request.Request(url)# 添加headers 使之看起来像浏览器在访问req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 ' '(KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36')
    response = urllib.request.urlopen(req)# 得到网页内容,注意必须使用decode()解码html = response.read().decode('utf-8')
Copier après la connexion

print(html), le contenu est le suivant :

Crawler Python pour les débutants : blagues d'exploration

Puis-je regarder ça ? Où est la blague ? Et la blague que nous voulons ? !

Oh, au fait, vérifiez les en-têtes comme celui-ci.

Appuyez sur F12, puis... regardez l'image

Crawler Python pour les débutants : blagues d'exploration

2. Correspondance régulière pour extraire des blagues

Pour. filtrer les correspondances Le contenu que les gens ordinaires lisent (s'il contient encore des balises html, comment peut-il être lu ?), les blagues sont extraites avec succès. Pour cela, nous avons besoin de modèles établis pour correspondre à l'ensemble du contenu de la page Web, et renvoie les objets qui correspondent avec succès au modèle. Nous utilisons des expressions régulières puissantes pour la correspondance (expression régulière). La syntaxe appropriée peut être trouvée ici.

Uniquement pour le contenu de la page Web dans cet exemple, voyons d'abord à quel contenu de la page Web correspond le paragraphe dont nous avons besoin.

Crawler Python pour les débutants : blagues d'exploration

Vous pouvez voir que le paragraphe est entouré de balises comme <div class="j-r-list-c-desc">(我们要的内容)</div> Il vous suffit de préciser les règles correspondantes pour l'extraire ! Comme vous pouvez le voir sur l'image ci-dessus, il y a de nombreux espaces avant et après le texte du paragraphe, qui doivent correspondre.

pattern = re.compile(r&#39;<div class="j-r-list-c-desc">\s+(.*)\s+</div>&#39;)
result = re.findall(pattern, html)
Copier après la connexion

Établissez des règles grâce à la fonction re de la bibliothèque compile.

  • s+ peut correspondre à un ou plusieurs espaces

  • . correspond à tous les caractères sauf le caractère de nouvelle ligne n.

Maintenant que nous avons les résultats correspondants, jetons un coup d'œil.

Crawler Python pour les débutants : blagues d'exploration

Bingo ! Il a été extrait, non ? !

Mais nous avons trouvé des choses désagréables à l'intérieur <br />. Ce n'est pas grave, écrivez simplement quelques lignes de code. Je ne montrerai pas le contenu supprimé ici, faites-vous simplement votre propre opinion haha.

    for each in content:# 如果某个段子里有<br />if &#39;<br />&#39; in each:# 替换成换行符并输出new_each = re.sub(r&#39;<br />&#39;, &#39;\n&#39;, each)print(new_each)# 没有就照常输出else:print(each)
Copier après la connexion

Voici content la liste que nous revenons via re.findall().

À ce stade, nous avons réussi à obtenir les blagues que nous voulons voir ! Et si vous souhaitez le télécharger localement ?

3. Téléchargez des blagues sur le

En définissant une fonction save(), les paramètres num sont personnalisés par l'utilisateur. Il n'y a aucun problème à télécharger le contenu des 100 dernières. des pages ! Certaines variables ne sont pas mentionnées, et le code source sera donné à la fin.

# num是指定网页页数def save(num):# 写方式打开一个文本,把获取的段子列表存放进去with open(&#39;a.txt&#39;, &#39;w&#39;, encoding=&#39;utf-8&#39;) as f:
        text = get_content(num)# 和上面去掉<br />类似for each in text:if &#39;<br />&#39; in each:
                new_each = re.sub(r&#39;<br />&#39;, &#39;\n&#39;, each)
                f.write(new_each)else:
                f.write(str(each) + &#39;\n&#39;)
Copier après la connexion

Après le téléchargement dans le fichier local, cela se présente comme indiqué dans la figure ci-dessous

Crawler Python pour les débutants : blagues d'exploration

4. une par une

Il y a tellement de blagues et une gamme éblouissante d'entre elles. Mais nous voulons juste les lire un par un. Vous pouvez passer à l'élément suivant en appuyant sur n'importe quelle touche du clavier, et le programme ne se terminera pas tant que le dernier élément n'est pas lu, ou vous pouvez quitter le programme à tout moment en définissant une touche de sortie, comme en définissant le q clé pour sortir. Le code complet est donné ici.

import urllib.requestimport urllib.parseimport re

pattern = re.compile(r'
\s+(.*)\s+
')# 返回指定网页的内容def open_url(url): req = urllib.request.Request(url) req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 ' '(KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36') response = urllib.request.urlopen(req) html = response.read().decode('utf-8')return html# num为用户自定,返回的是所有页的段子列表def get_content(num):# 存放段子的列表text_list = []for page in range(1, int(num)): address = 'http://www.budejie.com/text/' + str(page) html = open_url(address) result = re.findall(pattern, html)# 每一页的result都是一个列表,将里面的内容加入到text_listfor each in result: text_list.append(each)return text_list# num是指定网页页数def save(num):# 写方式打开一个文本,把获取的段子列表存放进去with open(&#39;a.txt&#39;, &#39;w&#39;, encoding=&#39;utf-8&#39;) as f: text = get_content(num)# 和上面去掉<br />类似for each in text:if &#39;<br />&#39; in each: new_each = re.sub(r&#39;<br />&#39;, &#39;\n&#39;, each) f.write(new_each)else: f.write(str(each) + &#39;\n&#39;) if __name__ == '__main__':print('阅读过程中按q随时退出') number = int(input('想读几页的内容: ')) content = get_content(number + 1)for each in content:if '<br />' in each: new_each = re.sub(r'<br />', '\n', each)print(new_each)else:print(each)# 用户输入user_input = input()# 不区分大小写的q,输入则退出if user_input == 'q' or user_input == 'Q':break
Copier après la connexion

Démontrez-le, l'effet est comme ça.
Crawler Python pour les débutants : blagues d'exploration

Bien que la fonction soit inutile, en tant que débutant, je suis quand même très satisfait Si vous êtes intéressé, vous pouvez aller plus loin ! Le robot d'exploration n'est pas seulement cela, nous apprendrons des fonctions plus avancées à l'avenir.


par @sunhaiyu

2016.8.15

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal