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
et importez la bibliothèque associée de urllib
En Python 3, il doit être écrit comme. ceci :
import urllib.requestimport urllib.parseimport re
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')
print(html)
, le contenu est le suivant :
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
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.
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'<div class="j-r-list-c-desc">\s+(.*)\s+</div>') result = re.findall(pattern, html)
Établissez des règles grâce à la fonction
re
de la bibliothèquecompile
.
s+
peut correspondre à un ou plusieurs espaces
.
correspond à tous les caractères sauf le caractère de nouvelle lignen
.
Maintenant que nous avons les résultats correspondants, jetons un coup d'œil.
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 '<br />' in each:# 替换成换行符并输出new_each = re.sub(r'<br />', '\n', each)print(new_each)# 没有就照常输出else:print(each)
Voici
content
la liste que nous revenons viare.findall()
.
À ce stade, nous avons réussi à obtenir les blagues que nous voulons voir ! Et si vous souhaitez le télécharger localement ?
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('a.txt', 'w', encoding='utf-8') as f: text = get_content(num)# 和上面去掉<br />类似for each in text:if '<br />' in each: new_each = re.sub(r'<br />', '\n', each) f.write(new_each)else: f.write(str(each) + '\n')
Après le téléchargement dans le fichier local, cela se présente comme indiqué dans la figure ci-dessous
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('a.txt', 'w', encoding='utf-8') as f: text = get_content(num)# 和上面去掉<br />类似for each in text:if '<br />' in each: new_each = re.sub(r'<br />', '\n', each) f.write(new_each)else: f.write(str(each) + '\n') 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
Démontrez-le, l'effet est comme ça.
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!