>  기사  >  백엔드 개발  >  재미있는 페이지 크롤러를 만드는 python3

재미있는 페이지 크롤러를 만드는 python3

高洛峰
高洛峰원래의
2017-02-14 13:37:001824검색

인터넷에 있는 대부분의 Python 튜토리얼은 2.X 버전입니다. python3.X와 비교하면 python2.X는 많은 라이브러리가 다르게 설치되어 있습니다. .예

0x01

봄 축제 기간 동안 할 일이 없어서(얼마나 한가한지) 농담을 하고 프로그램 작성 과정을 기록하기 위해 간단한 프로그램을 작성했습니다. 제가 크롤러들과 처음 접한 건 이런 글을 봤을 때였습니다. 오믈렛에서 여자들이 크롤링하는 사진에 대한 재미있는 글이었죠. 그래서 고양이와 호랑이 흉내를 내기 시작했고 사진도 몇 장 찍었습니다.

기술은 미래에 영감을 줍니다. 프로그래머로서 어떻게 그런 일을 할 수 있습니까? 신체적, 정신적 건강에 더 좋은 농담을 만드는 것이 더 낫습니다.

재미있는 페이지 크롤러를 만드는 python3

0x02

팔을 걷어붙이고 시작하기 전에 몇 가지 이론적 지식을 대중화해 보겠습니다.

간단히 말하면 웹페이지의 특정 위치에 콘텐츠를 끌어내려야 합니다. 어떻게 끌어내려야 할까요? 먼저 웹페이지를 분석하여 어떤 콘텐츠가 있는지 확인해야 합니다. 필요. 예를 들어, 이번에 크롤링한 것은 재미있는 웹사이트의 농담인데, 재미있는 웹사이트의 농담 페이지를 열면 이러한 콘텐츠를 얻는 것이 우리의 목적입니다. 읽고 나서 진정하세요. 계속 이렇게 웃으면 우리는 코드를 작성할 수 없습니다. Chrome에서는 Inspect Element를 연 다음 HTML 태그를 레벨별로 확장하거나 작은 마우스를 클릭하여 필요한 요소를 찾습니다.

재미있는 페이지 크롤러를 만드는 python3

마지막으로

의 내용이 우리에게 필요한 농담임을 알 수 있습니다. . 따라서 이 웹페이지에서 모든

를 찾은 다음 내부 콘텐츠를 추출하면 작업이 완료됩니다.

0x03

자, 이제 목적을 알았으니 이제 본격적으로 시작하겠습니다. 여기서는 python3을 사용하고 있습니다. python2와 python3의 선택은 모두가 스스로 결정할 수 있지만 약간의 차이가 있습니다. 하지만 여전히 python3을 사용하는 것이 좋습니다.
필요한 콘텐츠를 내려야 합니다. 먼저 이 웹페이지를 내려야 합니다. 여기서는 urllib라는 라이브러리를 사용하여 가져옵니다. 전체 웹페이지.
먼저 urllib를 가져옵니다


코드 복사 코드는 다음과 같습니다.

import urllib.request as request

그런 다음 요청을 사용하여 웹페이지를 가져올 수 있습니다.


코드를 복사하세요 코드는 다음과 같습니다.

def getHTML(url ):
return request.urlopen(url).read()

인생은 짧습니다. 저는 Python을 사용하고, 코드 한 줄, 웹페이지를 다운로드한다고 하더군요. 파이썬을 사용하지 않을 이유가 없습니다.
웹페이지를 다운로드한 후 웹페이지를 구문 분석하여 필요한 요소를 가져와야 합니다. 요소를 구문 분석하려면 Beautiful Soup이라는 또 다른 도구를 사용해야 합니다. 이를 사용하면 HTML과 XML을 빠르게 구문 분석하고 필요한 요소를 얻을 수 있습니다.


코드 복사 코드는 다음과 같습니다.

soup = BeautifulSoup(getHTML("http://www.pengfu. com/xiaohua_1 .html"))

BeautifulSoup을 사용하여 웹 페이지를 구문 분석하는 것은 한 문장에 불과하지만 코드를 실행하면 구문 분석기를 지정하라는 경고 메시지가 나타납니다. 그렇지 않으면 작동하지 않을 수 있습니다. 다른 플랫폼에서 또는 시스템에서 오류가 보고됩니다.


코드 복사 코드는 다음과 같습니다.

/Library/Frameworks/Python.framework/Versions/3.5/lib/ python3.5 /site-packages/bs4/__init__.py:181: UserWarning: 구문 분석기가 명시적으로 지정되지 않았으므로 이 시스템에 가장 적합한 HTML 구문 분석기("lxml")를 사용하고 있습니다. 이는 일반적으로 문제가 되지 않습니다. , 그러나 이 코드를 다른 시스템이나 다른 가상 환경에서 실행하면 다른 파서를 사용하여 다르게 동작할 수 있습니다.

이 경고를 발생시킨 코드는 joke.py 파일의 64번째 줄에 있습니다. . 이 경고를 없애려면 다음과 같은 코드를 변경하세요.

BeautifulSoup([your markup])

이것으로:

BeautifulSoup([your markup], "lxml" )

markup_type=markup_type))

파서의 유형과 파서 간의 차이점은 현재 공식 문서에 자세히 설명되어 있습니다. lxml 파싱을 사용하는 것이 더 안정적입니다. .
수정 후


코드 복사 코드는 다음과 같습니다.

soup = BeautifulSoup(getHTML("http: //www.pengfu.com/xiaohua_1.html", 'lxml'))

이렇게 하면 위의 경고가 발생하지 않습니다.


코드 복사 코드는 다음과 같습니다.

p_array = 수프.find_all('p', {'class': "content- imgclearfix pt10relative"})

find_all 함수를 사용하여 class = content-imgclearfix pt10relative의 모든 p 태그를 찾은 다음 이 배열을 탐색합니다


코드 복사 코드는 다음과 같습니다.

for x in p_array: content = x.string

이런 방식으로 대상의 내용을 가져옵니다. 피. 이 시점에서 우리는 목표를 달성했고 농담에 이르렀습니다.
그런데 같은 방법으로 크롤링하면 이런 오류가 보고됩니다


코드를 복사하세요 코드는 다음과 같습니다

raise RemoteDisconnected("Remote end Closed Connection Without" http.client.RemoteDisconnected: 원격 끝에서 응답 없이 연결을 닫았습니다

원격 끝에서 응답이 없다고 나와 링크를 닫고 네트워크를 확인한 후 문제가 없는 걸까요? 자세가 잘못된 걸까요?
패킷을 캡처하기 위해 찰스를 열면 응답이 없습니다. 아, 브라우저에서 액세스할 수 없는 이유는 무엇입니까? Charles를 살펴본 후 urllib를 사용하여 시작된 요청의 경우 UA 기본값은 Python-urllib/3.5이고 Chrome에서 UA에 액세스할 때는 User-Agent:Mozilla/5.0(Macintosh, Intel Mac OS X 10_12_3)이라는 것을 발견했습니다. ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36, 서버가 UA 기반 Python 크롤러를 거부하기 때문일까요? 위장하여 시도해보고 작동하는지 확인해 보겠습니다


코드 복사 코드는 다음과 같습니다.

def getHTML(url):
headers = {'User-Agent': 'User-Agent :Mozilla /5.0 (Macintosh; Intel Mac OS .urlopen(req).read()

이런 식으로 Python을 Chrome으로 위장하여 Qibai의 웹페이지를 얻어와서 원활하게 데이터를 얻을 수 있습니다.

이제 Python을 사용하여 Qibaihe를 크롤링할 수 있습니다. Pangbelly.com의 농담은 끝났습니다. 해당 웹 페이지를 분석하고 관심 있는 요소를 찾고 Python의 강력한 기능을 사용하면 됩니다. 목표를 달성하려면 XXOO 사진이든 농담이든 한 번의 클릭으로 할 수 있습니다. 더 이상 이야기하지 않고 소녀 사진을 찾아 보겠습니다.

# -*- coding: utf-8 -*-
import sys
import urllib.request as request
from bs4 import BeautifulSoup

def getHTML(url):
  headers = {'User-Agent': 'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'}
  req = request.Request(url, headers=headers)
  return request.urlopen(req).read()

def get_pengfu_results(url):
  soup = BeautifulSoup(getHTML(url), 'lxml')
  return soup.find_all('p', {'class':"content-img clearfix pt10 relative"})

def get_pengfu_joke():
  for x in range(1, 2):
    url = 'http://www.pengfu.com/xiaohua_%d.html' % x
    for x in get_pengfu_results(url):
      content = x.string
      try:
        string = content.lstrip()
        print(string + '\n\n')
      except:
        continue
  return

def get_qiubai_results(url):
  soup = BeautifulSoup(getHTML(url), 'lxml')
  contents = soup.find_all('p', {'class':'content'})
  restlus = []
  for x in contents:
    str = x.find(&#39;span&#39;).getText(&#39;\n&#39;,&#39;<br/>&#39;)
    restlus.append(str)
  return restlus

def get_qiubai_joke():
  for x in range(1, 2):
    url = &#39;http://www.qiushibaike.com/8hr/page/%d/?s=4952526&#39; % x
    for x in get_qiubai_results(url):
      print(x + &#39;\n\n&#39;)
  return

if __name__ == &#39;__main__&#39;:
  get_pengfu_joke()
  get_qiubai_joke()

더 많은 python3 제작의 재미있는 웹페이지 크롤러와 관련 기사를 보려면 PHP 중국어 웹사이트에 주목하세요!

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