크롤러에 대해 이야기하면 매우 신비롭다고 느낄 수도 있지만 실제로는 우리가 상상하는 것만큼 마법적이지는 않습니다(물론 구글과 바이두의 크롤러는 복잡하고 강력합니다. 그 위력은 크롤러 자체의 힘이 아니라, 그러나 백그라운드 데이터 처리 및 데이터 마이닝 알고리즘은 매우 강력합니다.) 오늘 우리는 그 미스터리를 공개할 것입니다. 하하, 간단한 두 단계로 웹 날씨 크롤러 프로그램을 구현할 수 있습니다. . .
간단히 말하면 크롤러는 두 부분으로 구성됩니다. 1. 웹페이지의 텍스트 정보를 가져옵니다. 2. 원하는 데이터를 얻기 위한 데이터 분석.
1. 웹페이지 텍스트 정보를 얻습니다.
Python은 HTML을 얻는 데 매우 편리합니다. urllib 라이브러리를 사용하면 몇 줄의 코드만으로 필요한 기능을 얻을 수 있습니다.
#引入urllib库 import urllib def getHtml(url): page = urllib.urlopen(url) html = page.read() page.close() return html
여기에 반환되는 것은 웹 페이지의 소스 코드인 html 코드입니다.
그렇다면 우리가 원하는 정보를 어떻게 얻을 수 있을까요? 그런 다음 웹 페이지 분석에서 가장 일반적으로 사용되는 도구인 정규 표현식을 사용해야 합니다.
2. 정규식 등을 기반으로 필수 콘텐츠를 얻습니다.
정규식을 사용할 때는 웹페이지 정보의 구조를 잘 관찰하고 올바른 정규식을 작성해야 합니다.
파이썬 정규 표현식의 사용도 매우 간단합니다.
#引入正则表达式库 import re def getWeather(html): reg = '<a title=.*?>(.*?)</a>.*?<span>(.*?)</span>.*?<b>(.*?)</b>' weatherList = re.compile(reg).findall(html) return weatherList
설명:
여기서 reg는 정규 표현식이고 html은 첫 번째 단계에서 얻은 텍스트입니다. . findall의 기능은 HTML에서 정규 일치 항목과 일치하는 모든 문자열을 찾아 WeatherList에 저장하는 것입니다. 그런 다음 WeathereList의 데이터 출력을 열거합니다.
여기서 정규식 reg에 대해 주의해야 할 두 가지 사항이 있습니다.
하나는 "(.*?)" 입니다. () 안의 내용이 우리가 얻을 내용인 한, 대괄호가 여러 개 있으면 findall의 각 결과에는 이 대괄호 안의 내용이 포함됩니다. 위에는 도시, 최저 기온, 최고 기온에 해당하는 3개의 괄호가 있습니다.
다른 하나는 ".*?" 입니다. Python의 정규 일치는 기본적으로 탐욕적입니다. 즉, 기본적으로 가능한 한 많은 문자열과 일치합니다. 마지막에 물음표를 추가하면 non-greedy 모드, 즉 가능한 적은 수의 문자열과 일치한다는 의미입니다. 여기서는 매칭해야 할 도시가 여러 개이므로 비탐욕 모드를 사용해야 한다. 그렇지 않으면 매칭 결과가 하나만 남게 되어 부정확해진다.