Beim Crawlen stoßen wir häufig auf Anti-Crawling-Mechanismen, die den Einsatz einiger Tools und Techniken erfordern, um diese Hindernisse zu umgehen. Unter diesen sind reguläre Ausdrücke ein sehr wichtiges Werkzeug, das uns beim Datenabgleich und der Datenverarbeitung im Crawler helfen kann. Im Folgenden stellen wir vor, wie Sie reguläre Python-Ausdrücke zum Crawlen und Anti-Crawling verwenden.
Reguläre Ausdrücke sind ein Werkzeug zur Beschreibung von Textmustern. Sie können bestimmte Muster von Zielzeichenfolgen durch bestimmte Symbole und Wörter beschreiben. In Python können wir das re-Modul verwenden, um reguläre Ausdrücke zu manipulieren.
Wenn wir beispielsweise eine Telefonnummer (im Format xxx-xxxx-xxxx) zuordnen möchten, können wir den folgenden regulären Ausdruck verwenden:
import re regex = re.compile(r'd{3}-d{4}-d{4}')
In diesem regulären Ausdruck bedeutet d
Übereinstimmung mit Zahlen, {3}
bedeutet Übereinstimmung mit 3 Zahlen, {4}
bedeutet Übereinstimmung mit 4 Zahlen, -
bedeutet Übereinstimmung mit Bindestrichen. Durch diesen regulären Ausdruck können wir Telefonnummern zuordnen, die dem Muster entsprechen. 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
Unter diesen ist der Parameter headers
ein gefälschter Anforderungsheader, der uns helfen kann, einige zu umgehen Anti-Crawler-Mechanismen. response.text
stellt den erhaltenen Webseiteninhalt dar. Jetzt haben wir den Quellcode der Zielwebseite erhalten.
Verwenden Sie reguläre Ausdrücke für die Datenverarbeitung
Nachdem wir den Quellcode der Webseite erhalten haben, müssen wir reguläre Ausdrücke verwenden, um die benötigten Informationen zu extrahieren. Am Beispiel der Maoyan-Filmrangliste möchten wir die Namen und Veröffentlichungszeiten aller Filme in der Rangliste erhalten. Wenn wir uns den Quellcode ansehen, können wir feststellen, dass diese Informationen in den folgenden HTML-Tags enthalten sind:rrreee
Wir können den folgenden regulären Ausdruck verwenden, um den Filmnamen und die Veröffentlichungszeit abzugleichen: .*?
gibt einen nicht gierigen Abgleich an, d. h. nur den Abgleich mit dem erforderlichen Textinhalt. re.S
bedeutet, dass .
mit jedem Zeichen übereinstimmen kann, einschließlich Zeilenumbrüchen. Jetzt haben wir einen regulären Ausdruck erstellt, der Filmtitel und Veröffentlichungszeiten abgleicht. findall
für reguläre Ausdrücke verwenden, um die übereinstimmenden Ergebnisse zu extrahieren: In diesem Codeausschnitt ist der Code random.uniform(0, 3) > bedeutet, eine Zufallszahl zwischen 0 und 3 zu generieren, und <code>time.sleep(interval)
bedeutet, das Programm auf die entsprechende Zeit warten zu lassen.
Das obige ist der detaillierte Inhalt vonSo verwenden Sie reguläre Python-Ausdrücke zum Crawlen und Anti-Crawling. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!