>  기사  >  백엔드 개발  >  Python은 Google 검색 결과를 크롤링합니다.

Python은 Google 검색 결과를 크롤링합니다.

高洛峰
高洛峰원래의
2016-10-18 10:46:352010검색

얼마 전부터 Python을 사용하여 검색 엔진 결과를 크롤링하는 방법을 연구하고 있습니다. 구현 과정에서 많은 문제가 발생했습니다. 어린이 신발에서 동일한 문제가 발생하지 않기를 바랍니다. 미래에는 우회하세요.

1. 검색 엔진 선택

좋은 검색 엔진을 선택하면 보다 정확한 검색 결과를 얻을 수 있습니다. 제가 사용한 검색 엔진은 Google, Bing, Baidu, Yahoo! 등 4가지입니다. 프로그래머로서 Google을 최우선으로 선택합니다. 그런데 내가 가장 좋아하는 Google이 나에게 js 코드 한 뭉치만 돌려주는 것을 보니 내가 원하는 검색 결과가 전혀 나오지 않았다. 그래서 Bing 캠프를 한동안 사용해 본 결과 Bing에서 반환된 검색 결과가 내 문제에 적합하지 않다는 것을 알게 되었습니다. 제가 절망에 빠졌을 때 구글이 저를 구해줬습니다. 브라우저에서 js 사용을 금지하는 사용자를 처리하기 위해 Google에서는 다음 검색 URL을 참조하세요.

https://www.google.com .hk/search?hl= en&q=hello

 hl은 검색할 언어를 지정하고, q는 검색하려는 키워드입니다. 음, Google 덕분에 검색결과 페이지에 내가 크롤링하려는 콘텐츠가 포함되어 있습니다.

추신: 인터넷의 많은 방법에서는 Python을 사용하여 Google 검색 결과를 크롤링하거나 https://ajax.googleapis.com/ajax/services/search/web...을 사용합니다. 이 방법은 Google에서 더 이상 권장하지 않습니다. https://developers.google.com/web-search/docs/를 참조하세요. Google은 이제 맞춤 검색 API를 제공하지만 API는 하루에 100개의 요청으로 제한됩니다. 더 필요한 경우 해당 비용만 지불하면 됩니다.

2. Python은 웹 페이지를 크롤링하고 분석합니다.

Python을 사용하여 웹 페이지를 크롤링하는 것은 말할 것도 없이 매우 편리합니다.

def search(self, queryStr):
     queryStr = urllib2.quote(queryStr)
     url = 'https://www.google.com.hk/search?hl=en&q=%s' % queryStr
     request = urllib2.Request(url)
     response = urllib2.urlopen(request)
     html = response.read()
     results = self.extractSearchResults(html)

html을 참조하세요. 6번째 줄은 우리가 크롤링한 검색 결과 페이지의 소스 코드입니다. Python을 사용한 학생들은 Python이 URL 요청과 관련된 두 개의 모듈인 urllib 및 urllib2를 제공한다는 것을 알게 될 것입니다. 그러나 urllib는 URL만 수신할 수 있는 반면 urllib2는 Request 클래스의 인스턴스를 허용할 수 있습니다. URL 요청의 헤더를 설정합니다. 이는 사용자 에이전트 등을 위장할 수 있음을 의미합니다(아래에서 사용됨).

이제 Python을 사용하여 웹 페이지를 크롤링하고 저장할 수 있으므로 소스 코드 페이지에서 원하는 검색 결과를 추출할 수 있습니다. Python은 htmlparser 모듈을 제공하지만 사용하기가 비교적 번거롭습니다. 여기서는 매우 유용한 웹페이지 분석 패키지인 BeautifulSoup을 추천합니다.

위 코드를 사용하면 적은 수의 쿼리에는 비교적 괜찮지만 수천 개의 쿼리를 수행하려는 경우 Google은 더 이상 요청 소스를 감지하지 못합니다. 귀하가 기계를 사용하여 Google 검색결과를 자주 크롤링하는 경우 Google은 귀하의 IP를 차단하고 곧 503 오류 페이지를 반환합니다. 이는 우리가 원하는 결과가 아니므로

계속 탐색해 보겠습니다. 앞서 언급했듯이 urllib2를 사용하면 URL 요청의 헤더를 설정하고 사용자 에이전트를 위장할 수 있습니다. 간단히 말해서, 사용자 에이전트는 클라이언트 브라우저와 같은 애플리케이션에서 사용하는 특수 네트워크 프로토콜로, 브라우저(이메일 클라이언트/검색 엔진 스파이더)가 HTTP 요청을 할 때마다 서버로 전송되며, 서버는 사용자를 알고 있습니다. (이메일 클라이언트/검색 엔진 스파이더)를 사용하여 액세스합니다. 때때로 어떤 목적을 달성하기 위해 우리는 선의로 서버를 속이고 내가 당신에게 접근하기 위해 기계를 사용하지 않는다고 말해야 합니다.

따라서 코드는 다음과 같습니다.

user_agents = ['Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20130406 Firefox/23.0', \
         'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0', \
         'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533+ \
         (KHTML, like Gecko) Element Browser 5.0', \
         'IBM WebExplorer /v0.94', 'Galaxy/1.0 [en] (Mac OS X 10.5.6; U; en)', \
         'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)', \
         'Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14', \
         'Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) \
         Version/6.0 Mobile/10A5355d Safari/8536.25', \
         'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) \
         Chrome/28.0.1468.0 Safari/537.36', \
         'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0; TheWorld)']
 def search(self, queryStr):
     queryStr = urllib2.quote(queryStr)
     url = 'https://www.google.com.hk/search?hl=en&q=%s' % queryStr
     request = urllib2.Request(url)
     index = random.randint(0, 9)
     user_agent = user_agents[index]
     request.add_header('User-agent', user_agent)
     response = urllib2.urlopen(request)
     html = response.read()
     results = self.extractSearchResults(html)

user_agents 목록에 겁먹지 마세요. 실제로는 10개의 사용자 에이전트 문자열입니다. 이렇게 하면 더 잘 위장할 수 있습니다. 더 많은 사용자 에이전트가 필요하면 여기 UserAgentString을 참조하세요.

17-19행은 사용자 에이전트 문자열을 무작위로 선택한 다음 요청의 add_header 메서드를 사용하여 사용자 에이전트를 위장하는 것을 나타냅니다.

사용자 에이전트를 위장하여 검색 엔진 결과를 계속 크롤링할 수 있습니다. 이것이 작동하지 않으면 두 쿼리 사이에 일정 시간 동안 무작위로 잠을 자는 것이 좋습니다. 이는 크롤링 속도에 영향을 미칩니다. 더 지속적인 크롤링 결과를 얻을 수 있습니다. IP가 여러 개인 경우 크롤링 속도도 빨라집니다.


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.