>  기사  >  백엔드 개발  >  양심 추천! Python 크롤러 마스터를 위한 8가지 필수 기술!

양심 추천! Python 크롤러 마스터를 위한 8가지 필수 기술!

PHPz
PHPz앞으로
2023-04-13 11:55:051565검색

양심 추천! Python 크롤러 마스터를 위한 8가지 필수 기술!

크롤러를 빨리 배우고 싶다면 가장 배울 가치가 있는 언어는 Python이어야 합니다. Python에는 빠른 웹 개발, 크롤러, 자동화된 운영 및 유지 관리 등과 같은 많은 응용 프로그램 시나리오가 있습니다. 자동으로 스크립트를 게시하고, 스크립트, 간단한 인증 코드 인식 스크립트를 보내고 받습니다.

크롤러도 개발 과정에서 많은 재사용 과정을 거치게 됩니다. 오늘은 앞으로 시간과 노력을 절약하고 작업을 효율적으로 완료할 수 있는 8가지 필수 기술을 요약하겠습니다.

1. 웹 페이지의 기본 크롤링

get 메소드

import urllib2
url = "http://www.baidu.com"
response = urllib2.urlopen(url)
print response.read()

post 메소드

import urllib
import urllib2
url = "http://abcde.com"
form = {'name':'abc','password':'1234'}
form_data = urllib.urlencode(form)
request = urllib2.Request(url,form_data)
response = urllib2.urlopen(request)
print response.read()

2. 프록시 IP 사용

크롤러를 개발하는 과정에서 IP가 차단되는 상황이 자주 발생하므로, 프록시 IP를 사용하세요. urllib2 패키지에 ProxyHandler 클래스가 있습니다. 다음 코드 조각에 표시된 대로 이 클래스를 통해 웹 페이지에 액세스하기 위한 프록시를 설정할 수 있습니다.

import urllib2
proxy = urllib2.ProxyHandler({'http': '127.0.0.1:8087'})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
response = urllib2.urlopen('http://www.baidu.com')
print response.read()

3. 쿠키는 다음과 같습니다. 사용자의 신원을 식별하고 세션 추적을 수행하기 위해 일부 웹 사이트에서 사용자의 메모리에 저장합니다. 로컬 터미널의 데이터(일반적으로 암호화됨)에 대해 Python은 쿠키 처리를 위한 cookielib 모듈을 제공하는 것입니다. 쿠키를 저장할 수 있는 객체로, urllib2 모듈과 함께 사용하여 인터넷 리소스에 액세스할 수 있습니다. WeChat: Architect Guide에서 공개 계정을 검색하고 Architect Get Information이라고 답장하세요.


코드 조각:

import urllib2, cookielib
cookie_support= urllib2.HTTPCookieProcessor(cookielib.CookieJar())
opener = urllib2.build_opener(cookie_support)
urllib2.install_opener(opener)
content = urllib2.urlopen('http://XXXX').read()

키는 HTTP 쿠키 값을 관리하고, HTTP 요청에 의해 생성된 쿠키를 저장하고, 나가는 HTTP 요청에 쿠키 개체를 추가하는 데 사용되는 CookieJar()입니다. 전체 쿠키는 메모리에 저장되며 CookieJar 인스턴스의 가비지 수집 후에는 쿠키가 손실됩니다. 모든 프로세스가 별도로 작동할 필요가 없습니다.


수동으로 쿠키 추가:

cookie = "PHPSESSID=91rurfqm2329bopnosfu4fvmu7; kmsign=55d2c12c9b1e3; KMUID=b6Ejc1XSwPq9o756AxnBAg="
request.add_header("Cookie", cookie)

4. 브라우저로 위장

일부 웹사이트는 크롤러의 방문을 혐오하여 크롤러의 요청을 거부합니다. 따라서 urllib2를 사용하여 웹 사이트에 직접 액세스할 때 HTTP 오류 403: 금지됨이 자주 발생합니다.


서버는 다음 헤더를 확인합니다.


User-Agent 일부 서버 또는 프록시는 이 값을 확인하여 브라우저에서 시작된 요청인지 확인합니다. REST 인터페이스를 사용할 때 서버는 이 값을 확인하여 HTTP 본문의 콘텐츠를 구문 분석하는 방법을 결정합니다. 이는 http 패키지의 헤더를 수정하여 수행할 수 있습니다.
    import urllib2
    headers = {
     'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'
    }
    request = urllib2.Request(
     url = 'http://my.oschina.net/jhao104/blog?catalog=3463517',
     headers = headers
    )
    print urllib2.urlopen(request).read()
  • 5. 페이지 파싱
  • 페이지 파싱을 위한 가장 강력한 도구는 물론 정규식입니다. 이는 웹사이트와 사용자마다 다르기 때문에 너무 많이 설명할 필요가 없습니다.

  • 두 번째는 파싱 라이브러리입니다. lxml과 BeautifulSoup을 사용했습니다

이 두 라이브러리에 대해 제 평가는 둘 다 HTML/XML 처리 라이브러리라는 것입니다. Beautifulsoup는 순수하게 Python으로 구현되어 비효율적이지만 그 기능은 실용적입니다. HTML 노드는 검색 결과를 통해 얻을 수 있습니다. lxml C 언어 인코딩은 효율적이며 Xpath를 지원합니다.

6. 인증코드 처리

일부 간편인증코드의 경우 간편식별이 가능합니다. 간단한 인증번호 인식만 해봤습니다. 그러나 12306과 같은 일부 반인간 인증코드는 코딩 플랫폼을 통해 수동으로 코딩할 수 있다. 물론 이를 위해서는 수수료가 필요하다.


7. Gzip 압축


어떻게 트랜스코딩해도 왜곡되는 웹페이지를 본 적이 있나요? 하하, 그 말은 많은 웹 서비스가 압축된 데이터를 전송하는 기능을 가지고 있다는 것을 모르신다는 뜻입니다. 이를 통해 네트워크 회선에서 전송되는 대량의 데이터를 60% 이상 줄일 수 있습니다. XML 데이터는 매우 높은 수준으로 압축될 수 있으므로 XML 웹 서비스의 경우 특히 그렇습니다.

그러나 일반적으로 서버는 사용자가 압축된 데이터를 처리할 수 있다고 서버에 알리지 않는 한 압축된 데이터를 보내지 않습니다.


따라서 다음과 같이 코드를 수정해야 합니다.

import urllib2, httplib
request = urllib2.Request('http://xxxx.com')
request.add_header('Accept-encoding', 'gzip')
opener = urllib2.build_opener()
f = opener.open(request)

이것이 핵심입니다. 요청 객체를 생성하고 Accept-encoding 헤더를 추가하여 gzip 압축 데이터를 허용할 수 있음을 서버에 알리는 것입니다.

그런 다음 데이터 압축을 풉니다.

import StringIO
import gzip
compresseddata = f.read()
compressedstream = StringIO.StringIO(compresseddata)
gzipper = gzip.GzipFile(fileobj=compressedstream)
print gzipper.read()

8. 다중 스레드 동시 크롤링

단일 스레드가 너무 느리면 다중 스레드가 필요합니다. 다음은 간단한 스레드 풀 템플릿입니다. 병행하고 있음을 알 수 있다.
  • Python의 멀티스레딩은 쓸모가 없지만 네트워크를 자주 사용하는 크롤러의 경우 효율성을 어느 정도 향상시킬 수 있습니다.

from threading import Thread
from Queue import Queue
from time import sleep
# q是任务队列
#NUM是并发线程总数
#JOBS是有多少任务
q = Queue()
NUM = 2
JOBS = 10
#具体的处理函数,负责处理单个任务
def do_somthing_using(arguments):
 print arguments
#这个是工作进程,负责不断从队列取数据并处理
def working():
 while True:
 arguments = q.get()
 do_somthing_using(arguments)
 sleep(1)
 q.task_done()
#fork NUM个线程等待队列
for i in range(NUM):
 t = Thread(target=working)
 t.setDaemon(True)
 t.start()
#把JOBS排入队列
for i in range(JOBS):
 q.put(i)
#等待所有JOBS完成
q.join()

위 내용은 양심 추천! Python 크롤러 마스터를 위한 8가지 필수 기술!의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 51cto.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제