PHPScraper랑 Python3이 예뻐요.

얼마 전에 제 Goutte 핸드폰에서 찾았어요Symfony Team.이것은 매우 깔끔한 라이브러리로 누구나 사이트를 캡처하거나 외부 사이트에서 온 데이터를 간단하게 처리할 수 있다.Goutte를 사용할 때, 나는 내가 일부 기능을 추상화하는 것을 알아차렸다.한 프로젝트에서 다른 프로젝트로 복사하는 조수를 세운 후, 나는 전화를 걸어 그것들을 라이브러리로 옮겼다.scouting missions on GitHub출생.나의 해결 방안은 PHP의 인코딩 비용을 줄이는 것이다.
나는 그것을 GitHub에 놓고 VuePress 사이트를 기본 문서로 추가하여 잠시 보존했다.내가 또 깎아야 할 때까지.나의 새 프로젝트에 대해 나는 여러 가지 속성을 가진 링크를 추출해야 한다. 예를 들어 'target','rel '등이다. 이것은 빠른 조합의 링크 PHPScraper 로부터 시작하여, 결과적으로 나의 scraper가 파이톤 hacks 등 더 높은 라이브러리와 맞설 수 있는지 확인할 수 있는 기회이다.제한된 Python 지식과 Beautiful Soup, PHP Scraper를 사용하여 필요한 기능을 구축하기로 결정했습니다.
BeautifulSoup
요구 사항
이 두 항목 모두 이러한 요구를 만족시켜야 한다.
  • CLI 프로그램으로 실행
  • URL을 매개 변수로 사용
  • HTML 페이지 가져오기
  • 모든 링크 추출 사용
  • href
  • 목표
  • rel
  • 직함
  • 앵커 텍스트
  • 결과를 json으로 파일에 쓰기
  • 다섯 번째 부분은 사실상 간소화되었다. 데이터는 한층 더 처리될 것이지만, 이 실험에서 링크 데이터를 파일 시스템에 쓰기에는 충분하다.

    Python 3 및 BeautifulSoup 4를 사용하여 링크 삭제
    처음 언급한 바와 같이, 나의 파이톤 지식은 한계가 있기 때문에 구글은 어쩔 수 없이 이곳과 그곳에서 나를 도와야 한다.파이톤2와 파이톤3 사이의 각종 패키지 관리자와 강력한 차이로 인해 예상보다 작업이 많아졌다.원본 코드는 더 최적화될 수 있지만 수요를 충족시켰다.한마디로 소스 코드는 여전히 간단하며 길지 않다.
    from bs4 import BeautifulSoup
    import sys
    import urllib.request
    import json
    
    # Prep the request
    url = sys.argv[1]
    req = urllib.request.Request(
        url,
        data=None,
        headers={
            'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:80.0) Gecko/20100101 Firefox/80.0'
        }
    )
    
    # Get the site
    f = urllib.request.urlopen(req)
    content = f.read().decode('utf-8')
    
    # Parse the content
    soup = BeautifulSoup(content, "html.parser")
    
    data = []
    for link in soup.find_all('a'):
        data.append({
            'href': link.get('href'),
            'title': link.get('title'),
            'rel': link.get('rel'),
            'target': link.get('target'),
            'text': link.getText(),
        })
    
    with open('./links.json', 'w') as outfile:
        json.dump(data, outfile)
    
    앞에서 말한 바와 같이 이것은 결코 이상적이지 않을 수도 있다.

    PHPScraper 링크 추출기 구현
    위에서 설명한 바와 같이 PHP 버전의 경우, 나는 나의 버전을 사용했다.우선, 나는 새로운composer 프로젝트를 초기화한 다음에 'composer require spekulatius/phpscraper' 를 실행했다.소스 코드는 간단합니다.
    <?php
    
    require 'vendor/autoload.php';
    
    // Instantiate the library
    $web = new \spekulatius\phpscraper();
    
    // Navigate to the test page.
    $web->go($argv[1]);
    
    // Extract the links
    $links = $web->linksWithDetails;
    
    // Write the result
    file_put_contents('./links.json', json_encode($links));
    
    네 개의 기능 행 코드가 주석되어 있기 때문에, 나는 여기에 너무 많은 단어가 필요하지 않다고 생각한다.
    PHPScraper library
    성능 비교: BeautifulSoup 및 PHPScraper
    성능이 비교적 자연스럽고 어렵다.이것은 많은 요소에 달려 있는데, 그 중 상당 부분은 내가 통제할 수 없는 것이다.부작용을 줄이기 위해 이 테스트 설정을 선택했습니다.
  • 전용 서버
  • 에서 테스트 실행
  • 스크립트당 동일한 30개의 무작위 미리 선택 URL이 하나씩 하나씩 하나씩 제공됩니다
  • 시간은 Linux에 내장된 전체 실행 명령 시간을 사용하여 측정됩니다.
  • 스크립트당 5회 테스트 실행
    비록 이것은 가장 좋은 테스트 설정은 아니지만, 성능에 대한 느낌을 얻기 위해 이렇게 해야 한다.
    다음과 같은 방법으로 테스트 설정을 개선할 수 있습니다:.
  • 전체 URL 목록을 제출하여 스크립트 부팅 및 해석에 소요되는 시간을 줄임
  • HTML을 프리페치하고 네트워크 지연을 제거하기 위해 스크립트에 전달합니다.
  • 다음 명령을 사용하여 테스트를 실행합니다.
    URL을 읽을 때의 시간;python3 python3 미화 링크 추출기/링크 추출기를 만듭니다.py“$url”;완료
    URL을 읽을 때의 시간;php phpscraper 링크 추출기/링크 추출기를 만듭니다.php“$url”;완료
    성능 테스트 결과
    위에서 말한 바와 같이 이 테스트는 대표적이지 않고 기초 지식이 부족하다.나는 여전히 성능 차이를 나타내기 위해 몇 가지 숫자를 넣었다.
    BeautifulSoup의 Python 스크립트를 사용하여 url 목록을 처리하는 데 다음과 같은 시간이 걸렸습니다.
  • 21.1s
  • 19.2s
  • 16.0s
  • 14.9s
  • 16.4s
  • 30개의 URL 목록을 가져오고 처리하는 평균 시간은 약 17.5초입니다.
    PHPScraper를 사용한 PHP 스크립트는 다음과 같은 기능을 제공합니다.
  • 12.4s
  • 12.7s
  • 10.4s
  • 12.6s
  • 12.1s
  • 30개의 URL 목록을 가져오고 처리하는 평균 시간은 약 12.0초입니다.표준 라이브러리에서 삭제되지 않은 태그 (예: "isNofollow") 를 추가로 검사하는 처리 시간도 포함됩니다.
    기타 실험 및 테스트:
  • Extracting the length distribution of keywords using PHPScraper
  • 좋은 웹페이지 즐겨찾기