Python은 prose.com의 기사를 어떻게 크롤링합니까?

零下一度
풀어 주다: 2017-07-03 09:39:31
원래의
1609명이 탐색했습니다.

image.png

python 2.7 구성

    bs4

    requests
로그인 후 복사

pip를 사용하여 설치 sudo pip install bs4 설치

sudo pip 설치 요청

bs4는 웹 페이지를 크롤링하기 때문에 사용법을 간략하게 설명합니다. find_all

find와 find_all의 차이점은 반환되는 내용이 다르다는 것입니다. find는 일치하는 첫 번째 태그를 반환하고 태그의 내용은

find_all이 목록을 반환합니다

예를 들어, 우리는 test.html을 작성합니다. 테스트 find와 find_all의 차이점. 내용은

<html>
<head>
</head>
<body>
<div id="one"><a></a></div>
<div id="two"><a href="#">abc</a></div>
<div id="three"><a href="#">three a</a><a href="#">three a</a><a href="#">three a</a></div>
<div id="four"><a href="#">four<p>four p</p><p>four p</p><p>four p</p> a</a></div>
</body>
</html>
로그인 후 복사

 <br/>
로그인 후 복사

test.py의 코드는

from bs4 import BeautifulSoup
import lxml

if __name__==&#39;__main__&#39;:
  s = BeautifulSoup(open(&#39;test.html&#39;),&#39;lxml&#39;)
  print s.prettify()
  print "------------------------------"
  print s.find(&#39;div&#39;)
  print s.find_all(&#39;div&#39;)
  print "------------------------------"
  print s.find(&#39;div&#39;,id=&#39;one&#39;)
  print s.find_all(&#39;div&#39;,id=&#39;one&#39;)
  print "------------------------------"
  print s.find(&#39;div&#39;,id="two")
  print s.find_all(&#39;div&#39;,id="two")
  print "------------------------------"
  print s.find(&#39;div&#39;,id="three")
  print s.find_all(&#39;div&#39;,id="three")
  print "------------------------------"
  print s.find(&#39;div&#39;,id="four")
  print s.find_all(&#39;div&#39;,id="four")
  print "------------------------------"
로그인 후 복사

 <br/>
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

실행 후 지정된 태그를 가져오면 결과를 볼 수 있습니다. 두 개의 태그 세트를 얻을 때


image.png

할 때 둘의 차이점이 표시됩니다. 따라서 사용할 때 원하는 것에 주의해야 합니다. 그렇지 않으면 오류가 나타납니다. <br/>다음 단계는 요청을 통해 웹페이지 정보를 얻는 것입니다. 왜 다른 사람들이 들은 것과 다른 것에 대해 글을 쓰는지 잘 모르겠습니다. <br/>웹페이지에 직접 액세스하고 get을 통해 prose.com에서 여러 카테고리의 여러 보조 웹페이지를 얻습니다. 그런 다음 그룹 테스트를 통과하여 모든 웹페이지를 크롤링합니다

def get_html():
  url = ""
  two_html = [&#39;sanwen&#39;,&#39;shige&#39;,&#39;zawen&#39;,&#39;suibi&#39;,&#39;rizhi&#39;,&#39;novel&#39;]  for doc in two_html:
      i=1          if doc==&#39;sanwen&#39;:print "running sanwen -----------------------------"  if doc==&#39;shige&#39;:print "running shige ------------------------------"  if doc==&#39;zawen&#39;:print &#39;running zawen -------------------------------&#39;  if doc==&#39;suibi&#39;:print &#39;running suibi -------------------------------&#39;  if doc==&#39;rizhi&#39;:print &#39;running ruzhi -------------------------------&#39;  if doc==&#39;nove&#39;:print &#39;running xiaoxiaoshuo -------------------------&#39;  while(i<10):
        par = {&#39;p&#39;:i}
        res = requests.get(url+doc+&#39;/&#39;,params=par)if res.status_code==200:
          soup(res.text)
              i+=i
로그인 후 복사

 <br/>
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

코드의 이 부분에서는 200이 아닌 res.status_code를 처리하지 않았습니다. 결과적으로 문제는 오류가 발생하지 않는다는 것입니다. 표시되고 크롤링된 콘텐츠는 손실됩니다. 그러다가 Sanwen.net 웹페이지를 분석해 보니 www.sanwen.net/rizhi/&p=1
p의 최대값은 10입니다. 지난번에 디스크를 크롤링했을 때는 였네요. 100페이지는 나중에 분석하겠습니다. 그런 다음 get 메소드를 통해 각 페이지의 내용을 가져옵니다. <br/>각 페이지의 내용을 가져온 후 작성자와 제목을 분석합니다.

def soup(html_text):
  s = BeautifulSoup(html_text,&#39;lxml&#39;)
  link = s.find(&#39;div&#39;,class_=&#39;categorylist&#39;).find_all(&#39;li&#39;)  for i in link:if i!=s.find(&#39;li&#39;,class_=&#39;page&#39;):
      title = i.find_all(&#39;a&#39;)[1]
      author = i.find_all(&#39;a&#39;)[2].text
      url = title.attrs[&#39;href&#39;]
      sign = re.compile(r&#39;(//)|/&#39;)
      match = sign.search(title.text)
      file_name = title.text      if match:
        file_name = sign.sub(&#39;a&#39;,str(title.text))
로그인 후 복사

 <br/>
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

제목을 가져올 때 문제가 발생했습니다. 글을 쓸 때 제목에 슬래시를 추가하는 이유는 무엇입니까? 한개도 아니고 2개가 더 있습니다. 나중에 파일을 작성할 때 이 문제로 인해 파일명이 틀리게 되어 정규식을 작성해 드렸습니다. <br/>마지막 단계는 각 페이지의 분석을 통해 기사 주소를 얻은 다음, 원래는 웹 페이지 주소를 변경하여 하나씩 내용을 가져오고 싶었습니다. 문제.

def get_content(url):
  res = requests.get(&#39;&#39;+url)  if res.status_code==200:
    soup = BeautifulSoup(res.text,&#39;lxml&#39;)
    contents = soup.find(&#39;div&#39;,class_=&#39;content&#39;).find_all(&#39;p&#39;)
    content = &#39;&#39;for i in contents:
      content+=i.text+&#39;\n&#39;return content
로그인 후 복사

 <br/>
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

마지막으로 파일을 작성하고 저장하면 ok

   f = open(file_name+&#39;.txt&#39;,&#39;w&#39;)      print &#39;running w txt&#39;+file_name+&#39;.txt&#39;  f.write(title.text+&#39;\n&#39;)
      f.write(author+&#39;\n&#39;)
      content=get_content(url)     
      f.write(content)
      f.close()
로그인 후 복사

세 가지 기능이 산문 네트워크에서 산문을 가져오는데 문제가 있습니다. 일부 산문이 왜 손실되었는지 모르겠습니다. 대략적인 내용만 얻을 수 있습니다. 400개가 넘는 기사가 있습니다. 이것은 prose.com의 기사와 많이 다르지만 실제로는 페이지별로 얻은 것입니다. 이 문제. 물론 웹 페이지를 접근 불가능하게 만들어야 할 것 같아요

     f = open(file_name+&#39;.txt&#39;,&#39;w&#39;)      print &#39;running w txt&#39;+file_name+&#39;.txt&#39;  f.write(title.text+&#39;\n&#39;)
      f.write(author+&#39;\n&#39;)
      content=get_content(url)     
      f.write(content)
      f.close()
로그인 후 복사

렌더링을 잊어버릴 뻔했어요

코드가 지저분하지만, 난 멈추지 않았어


위 내용은 Python은 prose.com의 기사를 어떻게 크롤링합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿