Dans le processus d'exploration, nous rencontrons souvent des mécanismes anti-exploration, ce qui nous oblige à utiliser certains outils et techniques pour contourner ces obstacles. Parmi elles, les expressions régulières sont un outil très important, qui peut nous aider à effectuer la mise en correspondance et le traitement des données dans les robots d'exploration. Ci-dessous, nous expliquerons comment utiliser les expressions régulières Python pour l'exploration et l'anti-exploration.
L'expression régulière est un outil utilisé pour décrire des modèles de texte. Elle peut décrire le modèle spécifique de la chaîne cible à travers certains symboles et mots spécifiques. En Python, nous pouvons utiliser le module re pour manipuler des expressions régulières.
Par exemple, si nous voulons faire correspondre un numéro de téléphone (au format xxx-xxxx-xxxx), alors nous pouvons utiliser l'expression régulière suivante :
import re regex = re.compile(r'd{3}-d{4}-d{4}')
Dans cette expression régulière, d
signifie Faire correspondre les numéros, {3}
signifie faire correspondre 3 nombres, {4}
signifie faire correspondre 4 nombres, -
signifie faire correspondre les traits d'union. Grâce à cette expression régulière, nous pouvons faire correspondre les numéros de téléphone qui correspondent au modèle. d
表示匹配数字,{3}
表示匹配3个数字,{4}
表示匹配4个数字,-
表示匹配连字符。通过这个正则表达式,我们就可以匹配出符合该模式的电话号码。
在进行反爬虫之前,我们首先需要爬取目标网站的内容。在Python中,我们可以使用requests库来获取网页内容。例如,我们想要获取猫眼电影的排行榜页面,可以使用如下代码:
import requests url = 'https://maoyan.com/board' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3' } response = requests.get(url, headers=headers) html = response.text
其中,headers
参数是伪造的请求头,可以帮助我们绕过一些反爬虫机制。response.text
表示获取到的网页内容,现在我们已经拿到了目标网页的源代码。
拿到网页源代码后,我们需要使用正则表达式来提取出我们需要的信息。以猫眼电影排行榜为例,我们想要获取排行榜中所有电影的名称和上映时间。通过查看源代码,我们可以发现这些信息都在如下的HTML标签中:
<dd> <div class="movie-item-info"> <p class="name"><a href="/films/1211269" title="误杀" data-act="boarditem-click" data-val="{movieId:1211269}">误杀</a></p> <p class="star"> 主演:肖央,谭卓,钟南山 </p> <p class="releasetime">上映时间:2020-12-04</p> </div> <div class="movie-item-number score-num"> <p class="score"><i class="integer">9.</i><i class="fraction">7</i></p> </div> </dd>
我们可以使用如下的正则表达式来匹配出电影名称和上映时间:
pattern = re.compile('<p class="name"><a href="/films/d+" title="(.*?)" data-act="boarditem-click".*?<p class="releasetime">(.*?)</p>', re.S)
这个正则表达式中,.*?
表示非贪婪匹配,也就是只匹配必要的文本内容。re.S
表示让.
可以匹配任意字符,包括换行符。现在我们已经构建了一个可以匹配电影名称和上映时间的正则表达式。
接下来,我们可以使用正则表达式的findall
方法来提取出匹配到的结果:
movies = re.findall(pattern, html)
这个操作会返回一个列表,其中每一个元素都是一个元组,分别表示电影名称和上映时间。现在我们已经成功地爬取了猫眼电影排行榜页面中的所有电影信息。
在进行反爬虫之前,我们需要先理解一些网站常用的反爬虫手段,例如设置访问频率限制、IP封锁等。为了避免这些反爬虫机制,我们需要模拟用户正常的行为。比如,在爬取猫眼电影排行榜页面的时候,我们可以设置一个随机的时间间隔来模拟人类浏览网页的行为:
import time interval = random.uniform(0, 3) time.sleep(interval)
这个代码片段中,random.uniform(0, 3)
表示生成一个0到3之间的随机数,time.sleep(interval)
from selenium import webdriver url = 'https://weibo.com/xxxxxx' browser = webdriver.Firefox() browser.get(url) time.sleep(10) html = browser.page_source
Parmi eux, le paramètre headers
est un en-tête de requête falsifié, ce qui peut nous aider à contourner certains mécanismes anti-chenille. response.text
représente le contenu de la page Web obtenu. Nous avons maintenant obtenu le code source de la page Web cible.
Utilisez des expressions régulières pour le traitement des données
Après avoir obtenu le code source de la page Web, nous devons utiliser des expressions régulières pour extraire les informations dont nous avons besoin. En prenant comme exemple le classement des films Maoyan, nous souhaitons obtenir les noms et les heures de sortie de tous les films du classement. En regardant le code source, nous pouvons constater que cette information se trouve dans les balises HTML suivantes :rrreee
Nous pouvons utiliser l'expression régulière suivante pour faire correspondre le nom du film et l'heure de sortie : .*?
indique une correspondance non gourmande, c'est-à-dire une correspondance uniquement avec le contenu textuel nécessaire. re.S
signifie que .
peut correspondre à n'importe quel caractère, y compris les caractères de nouvelle ligne. Nous avons maintenant créé une expression régulière qui correspond aux titres de films et aux heures de sortie. findall
d'expressions régulières pour extraire les résultats correspondants : Dans cet extrait de code, random.uniform(0, 3) code > signifie générer un nombre aléatoire entre 0 et 3, et <code>time.sleep(interval)
signifie laisser le programme attendre le temps correspondant.
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!