크롤링 과정에서 크롤링 방지 메커니즘을 자주 접하게 되는데, 이를 위해서는 이러한 장애물을 우회하기 위해 몇 가지 도구와 기술을 사용해야 합니다. 그중 정규식은 크롤러에서 데이터 일치 및 처리를 수행하는 데 도움이 되는 매우 중요한 도구입니다. 아래에서는 크롤링 및 크롤링 방지에 Python 정규식을 사용하는 방법을 소개합니다.
정규식은 특정 기호와 단어를 통해 대상 문자열의 특정 패턴을 설명하는 데 사용되는 도구입니다. Python에서는 re 모듈을 사용하여 정규식을 조작할 수 있습니다.
예를 들어 전화번호(xxx-xxxx-xxxx 형식)를 일치시키려면 다음 정규식을 사용할 수 있습니다.
import re regex = re.compile(r'd{3}-d{4}-d{4}')
이 정규식에서 d
는 다음을 의미합니다. 숫자 일치, {3}
는 3개 숫자 일치, {4}
는 4개 숫자 일치, -
는 하이픈 일치를 의미합니다. 이 정규식을 통해 패턴과 일치하는 전화번호를 일치시킬 수 있습니다. 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
그 중 headers
매개변수는 위조된 요청 헤더이므로 일부를 우회하는 데 도움이 될 수 있습니다. 크롤러 방지 메커니즘. response.text
는 획득한 웹페이지 콘텐츠를 나타냅니다. 이제 대상 웹페이지의 소스 코드를 얻었습니다.
데이터 처리에 정규식 사용
웹페이지 소스 코드를 얻은 후에는 정규식을 사용하여 필요한 정보를 추출해야 합니다. Maoyan 영화 순위를 예로 들면, 순위에 있는 모든 영화의 이름과 개봉 시간을 얻고 싶습니다. 소스 코드를 살펴보면 이 정보가 다음 HTML 태그에 있음을 알 수 있습니다.rrreee
다음 정규식을 사용하여 영화 이름과 출시 시간을 일치시킬 수 있습니다. .*?
는 탐욕스럽지 않은 일치, 즉 필요한 텍스트 내용만 일치함을 나타냅니다. re.S
는 .
가 개행 문자를 포함한 모든 문자와 일치할 수 있음을 의미합니다. 이제 영화 제목과 개봉 시간을 일치시키는 정규식을 구축했습니다. findall
메서드를 사용하여 일치하는 결과를 추출할 수 있습니다. 이 코드 조각에서는 random.uniform(0, 3) code >는 0에서 3 사이의 난수를 생성한다는 의미이고, <code>time.sleep(interval)
은 프로그램이 해당 시간 동안 기다리도록 한다는 의미입니다.
위 내용은 크롤링 및 크롤링 방지를 위해 Python 정규식을 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!