Python 학습 웹 크롤러는 크게 크롤링 , 분석 , 저장의 3가지 섹션으로 나뉩니다.
또한 더 일반적으로 사용되는 크롤러 프레임워크인 Scrapy에 대해서는 여기 마지막에 자세히 소개하겠습니다.
먼저 웹 크롤러를 시작하는 데 필요한 기본 개념과 기술을 다루는 내가 요약한 관련 기사를 나열하겠습니다. Ning Ge's Small Station - Web Crawler
브라우저에 URL을 입력하고 Enter 키를 누르면 백그라운드에서는 어떤 일이 발생합니까? 예를 들어 http://www.lining0806.com/을 입력하시면 브라더닝 홈페이지가 나옵니다.
간단히 말해서 이 프로세스는 다음 네 단계로 진행됩니다.
웹 크롤러가 해야 할 일은 간단히 말해서 브라우저의 기능을 구현하는 것입니다. URL을 지정하면, 단계별로 얻기 위해 브라우저를 수동으로 조작할 필요 없이 사용자가 요구하는 데이터가 직접 반환됩니다.
이 단계에서는 어떤 콘텐츠를 얻고 싶은지 명확히 해야 합니까? HTML 소스 코드인가요, 아니면 Json 형식의 문자열인가요?
크롤링의 대부분은 get 요청, 즉 상대방 서버에서 직접 데이터를 가져오는 경우입니다.
우선, Python에는 기본적으로 일반적인 페이지 크롤링을 충족할 수 있는 urllib와 urllib2라는 두 가지 모듈이 제공됩니다. 또한 요청도 매우 유용한 패키지입니다. 이와 유사하게 httplib2 등이 있습니다.
Requests:
import requests
response = requests.get(url)
content = requests.get(url).content
print "response headers:", response.headers
print "content:", content
Urllib2:
import urllib2
response = urllib2.urlopen(url)
content = urllib2.urlopen(url).read()
print "response headers:", response.headers
print "content:", content
Httplib2:
import httplib2
http = httplib2.Http()
response_headers, content = http.request(url, 'GET')
print "response headers:", response_headers
print "content:", content
또한 쿼리 필드가 있는 URL의 경우 일반적으로 요청된 데이터를 URL에 추가하여 URL을 분할하고 데이터를 전송합니다. 여러 매개변수가 &로 연결됩니다.
data = {'data1':'XXXXX', 'data2':'XXXXX'}
Requests:data为dict,json
import requests
response = requests.get(url=url, params=data)
Urllib2:data为string
import urllib, urllib2
data = urllib.urlencode(data)
full_url = url+'?'+data
response = urllib2.urlopen(full_url)
관련 참조: NetEase 뉴스 순위 크롤링 검토
참고 프로젝트: 웹 크롤러 중 가장 기본적인 크롤러: NetEase 뉴스 순위 크롤링
2.1 양식을 사용하여 로그인
이 상황은 게시 요청입니다. 즉, 양식 데이터가 먼저 서버로 전송되고 서버는 반환된 쿠키를 로컬에 저장합니다.
data = {'data1':'XXXXX', 'data2':'XXXXX'}
Requests:data为dict,json
import requests
response = requests.post(url=url, data=data)
Urllib2:data为string
import urllib, urllib2
data = urllib.urlencode(data)
req = urllib2.Request(url=url, data=data)
response = urllib2.urlopen(req)
2.2 쿠키를 사용하여 로그인
쿠키를 사용하여 로그인하면 서버는 귀하가 로그인한 사용자라고 생각하여 로그인된 콘텐츠를 반환합니다. 따라서 인증코드가 필요한 경우 인증코드가 포함된 로그인 쿠키를 사용하여 문제를 해결할 수 있습니다.
import requests
requests_session = requests.session()
response = requests_session.post(url=url_login, data=data)
인증코드가 있는 경우 현재는 response=requests_session.post(url=url_login, data=data)를 사용할 수 없습니다. 방법은 다음과 같습니다.
response_captcha = requests_session.get(url=url_login, cookies=cookies)
response1 = requests.get(url_login) # 未登陆
response2 = requests_session.get(url_login) # 已登陆,因为之前拿到了Response Cookie!
response3 = requests_session.get(url_results) # 已登陆,因为之前拿到了Response Cookie!
관련 참조: 웹 크롤러 인증 코드 로그인
참고 프로젝트: 웹 크롤러 사용자 이름, 비밀번호 및 인증 코드 로그인: Zhihu 웹사이트 크롤링
3.1 프록시 사용
적용 가능한 상황: IP 주소를 제한하면 "잦은 클릭"으로 인해 로그인할 때 인증 코드를 입력해야 하는 문제도 해결할 수 있습니다.
이 경우 가장 좋은 방법은 프록시 IP 풀을 유지하는 것입니다. 인터넷에는 무료 프록시 IP가 많이 있으며, 사용할 수 있는 프록시 IP도 많이 있습니다. "빈번한 클릭"의 경우 크롤러가 웹사이트를 방문하는 빈도를 제한하여 웹사이트에서 차단되는 것을 방지할 수도 있습니다.
proxies = {'http':'http://XX.XX.XX.XX:XXXX'}
Requests:
import requests
response = requests.get(url=url, proxies=proxies)
Urllib2:
import urllib2
proxy_support = urllib2.ProxyHandler(proxies)
opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler)
urllib2.install_opener(opener) # 安装opener,此后调用urlopen()时都会使用安装过的opener对象
response = urllib2.urlopen(url)
3.2 시간 설정
적용 가능한 상황: 제한된 주파수 상황.
Requests와 Urllib2 모두 시간 라이브러리의 sleep() 함수를 사용할 수 있습니다.
import time
time.sleep(1)
3.3 브라우저로 위장하거나 "핫링크 방지"에 맞서 싸우세요
일부 웹사이트에서는 귀하가 실제로 브라우저를 통해 접속하고 있는지, 아니면 기계를 통해 자동으로 접속되는지 확인합니다. 이 경우 User-Agent와 함께 브라우저를 통해 액세스하고 있음을 보여줍니다. 때로는 추천인 정보가 포함되어 있는지, 추천인이 합법적인지 여부와 일반적으로 추천인도 확인합니다.
headers = {'User-Agent':'XXXXX'} # 伪装成浏览器访问,适用于拒绝爬虫的网站
headers = {'Referer':'XXXXX'}
headers = {'User-Agent':'XXXXX', 'Referer':'XXXXX'}
Requests:
response = requests.get(url=url, headers=headers)
Urllib2:
import urllib, urllib2
req = urllib2.Request(url=url, headers=headers)
response = urllib2.urlopen(req)
할 말이 많지 않습니다.
def multi_session(session, *arg):
retryTimes = 20
while retryTimes>0:
try:
return session.post(*arg)
except:
print '.',
retryTimes -= 1
또는
def multi_open(opener, *arg):
retryTimes = 20
while retryTimes>0:
try:
return opener.open(*arg)
except:
print '.',
retryTimes -= 1
이러한 방식으로 우리는 multi_session 또는 multi_open을 사용하여 크롤러가 캡처한 세션 또는 오프너를 유지할 수 있습니다.
다음은 월스트리트 뉴스의 병렬 크롤링에 대한 실험적 비교입니다. Python 다중 프로세스 크롤링과 Java 단일 스레드 및 다중 스레드 크롤링입니다.
관련 참조: Python과 Java의 다중 프로세스 및 다중 스레드 컴퓨팅 방법 비교
"더 많은 로드"의 경우 Ajax를 사용하여 많은 데이터를 전송합니다.
작동 방식: 웹 페이지의 URL에서 웹 페이지의 소스 코드를 로드한 후 JavaScript 프로그램이 브라우저에서 실행됩니다. 이러한 프로그램은 더 많은 콘텐츠를 로드하고 웹 페이지를 "채웁니다". 이것이 바로 웹페이지 자체의 URL을 크롤링하기 위해 직접 이동하면 페이지의 실제 콘텐츠를 찾을 수 없는 이유입니다.
여기서 구글 크롬을 이용하여 "요청"에 해당하는 링크를 분석하면(방법: 마우스 오른쪽 버튼 클릭 → 요소 검사 → 네트워크 → 지우기, "더 보기" 클릭하면 해당 GET 링크가 나타나서 Type of text/를 찾는다) HTML의 경우 클릭하면 매개변수 가져오기를 볼 수 있습니다. 또는 요청 URL을 복사하면 프로세스가 반복됩니다.
Selenium은 자동화된 테스트 도구입니다. 문자 채우기, 마우스 클릭, 요소 획득, 페이지 전환 및 일련의 작업을 포함하여 브라우저를 제어할 수 있습니다. 간단히 말해서, Selenium은 브라우저가 할 수 있는 모든 것을 할 수 있습니다.
여기에 나열된 코드는 셀레늄을 사용하여 주어진 도시 목록 다음에 Qunar.com에서 요금 정보를 동적으로 가져오는 코드입니다.
참조 프로젝트: 웹 크롤러 Selenium은 프록시 로그인을 사용합니다: Crawl Qunar 웹사이트
웹사이트에 인증 코드가 있는 경우 세 가지 방법이 있습니다.
프록시를 사용하고 쿠키를 사용하여 로그인하는 방법은 이전에 논의되었습니다. 이제 인증 코드 식별에 대해 이야기하겠습니다.
오픈 소스 Tesseract-OCR 시스템을 사용하여 인증 코드 이미지를 다운로드 및 인식하고 인식된 문자를 크롤러 시스템으로 전송하여 시뮬레이션된 로그인을 수행할 수 있습니다. 물론 식별을 위해 인증 코드 이미지를 코딩 플랫폼에 업로드할 수도 있습니다. 실패하면 성공할 때까지 확인 코드 ID를 다시 업데이트할 수 있습니다.
참고 프로젝트 : 인증코드 식별 프로젝트 버전 1 : Captcha1
크롤링 시 주의해야 할 두 가지 문제는 다음과 같습니다.
크롤링 후에는 필요한 콘텐츠가 무엇이든 해당 콘텐츠에서 관련 콘텐츠를 추출할 수 있습니다.
일반적인 분석 도구에는 정규식, BeautifulSoup, lxml 등이 포함됩니다.
필요한 것을 분석한 후 다음 단계는 이를 저장하는 것입니다.
텍스트 파일이나 MySQL, MongoDB 데이터베이스 등에 저장하도록 선택할 수 있습니다.
보관할 때 주의해야 할 두 가지 문제가 있습니다.
Scrapy는 업계에서 널리 사용되는 Twisted 기반의 오픈 소스 Python 크롤러 프레임워크입니다.
관련 내용은 Scrapy 기반의 웹 크롤러 구성을 참고할 수 있습니다. 동시에 이 글에서 소개한 WeChat 검색 크롤링 프로젝트 코드를 학습 참고자료로 제공합니다.
참조 프로젝트: Scrapy 또는 Requests를 사용하여 WeChat 검색 결과를 재귀적으로 크롤링
좋은 웹 크롤러는 먼저 로봇 프로토콜 을 준수해야 합니다. 로봇 프로토콜(크롤러 프로토콜, 로봇 프로토콜 등으로도 알려짐)의 전체 이름은 "로봇 제외 프로토콜"입니다. 웹사이트는 로봇 프로토콜을 사용하여 검색 엔진에 크롤링할 수 있는 페이지와 크롤링할 수 없는 페이지를 알려줍니다.
robots.txt 텍스트 파일(예: https://www.taobao.com/robots.txt)을 웹 사이트의 루트 디렉터리에 배치하면 다양한 웹 크롤러가 액세스할 수 있는 페이지와 액세스할 수 있는 페이지를 지정할 수 있습니다. 지정된 페이지는 일반 규칙에 따라 결정됩니다. 웹 크롤러는 이 웹사이트를 수집하기 전에 먼저 robots.txt 텍스트 파일을 얻은 다음 그 안에 있는 규칙을 구문 분석하고 규칙에 따라 웹사이트 데이터를 수집합니다.
User-agent: 指定对哪些爬虫生效
Disallow: 指定不允许访问的网址
Allow: 指定允许访问的网址
참고: 영어 단어는 대문자로 표기해야 합니다. 콜론은 영어로 되어 있으며 "/"는 전체 웹사이트를 나타냅니다.
禁止所有机器人访问
User-agent: *
Disallow: /
允许所有机器人访问
User-agent: *
Disallow:
禁止特定机器人访问
User-agent: BadBot
Disallow: /
允许特定机器人访问
User-agent: GoodBot
Disallow:
禁止访问特定目录
User-agent: *
Disallow: /images/
仅允许访问特定目录
User-agent: *
Allow: /images/
Disallow: /
禁止访问特定文件
User-agent: *
Disallow: /*.html$
仅允许访问特定文件
User-agent: *
Allow: /*.html$
Disallow: /