웹 캡처: scrapy 및 Scraper API를 사용하여 에이전트 및 인증 코드 관리

최초 출판 my website
본 시리즈firstsecond 부분에서 우리는 웹 캡처와 이 임무를 실현하는 데 응용할 수 있는 기술을 소개했다.우리는 Beautiful Soup과 selenium python 라이브러리를 사용하여 이 점을 실현했다.만약 네가 아직 없다면 그들을 봐라.
웹 scraping 시리즈의 마지막 부분에서 우리는 scrapy 라이브러리, 즉 scraper API를 탐색하고 이러한 도구를 사용하는 필요성을 이해할 것이다.
본 훈련에서 우리는 moviedb 사이트에서 데이터를 얻을 것이다.이것은 단지 하나의 예일 뿐입니다. 만약 당신이 그들의 어떤 데이터를 필요로 한다면 그들은 API를 제공할 것입니다.github에서 코드를 찾습니다.

왜 가려워요?


Scrapy는 오픈소스 python 라이브러리입니다.
Scrapy는 라인, 프로세스, 동기화 또는 기타 모든 일을 처리할 필요가 없이 사이트를 동시에 캡처할 수 있습니다.그것은 비동기적으로 당신의 요청을 처리합니다. 속도가 매우 빠릅니다.사용자 정의 파충류에서 유사한 기능을 실현하려면 비동기 라이브러리를 사용하거나 사용해야 합니다.
이 항목에 대한 자세한 내용은 post 를 참조하십시오.

왜 스크레이퍼 API를 사용합니까?


아래의 일부 링크는 부속 링크이므로 추가 비용을 지불할 필요가 없습니다.제가 개인적으로 사용한 제품, 도구와 학습 서비스만 추천하고 이 제품, 도구와 서비스가 정말 도움이 된다고 생각합니다.가장 중요한 것은 내가 절대로 네가 살 수 없거나 네가 아직 실행할 준비가 되지 않은 물건을 사는 것을 제창하지 않을 것이다.
Scraper API는 웹 페이지를 캡처할 때 IP 주소가 차단될 수 있다는 우려를 완화시키는 정책을 전문으로 하는 초창기 회사입니다.IP를 사용하여 회전하므로 테스트를 피할 수 있습니다.2천만 개가 넘는 IP 주소와 무제한 대역폭을 보유하고 있습니다.
이 밖에도 인증 코드 처리를 제공하고 헤더 없는 브라우저를 사용하면 인터넷 파충류로 검출되지 않고 진정한 사용자로 보일 수 있습니다.
python 생태계에서 사용은 scrapy에 국한되지 않고 Requests, Beautiful Soup, selenium과 함께 사용된다.다른 유행 플랫폼(예를 들어 node)과 통합하다.js, bash, PHP, 루비도 지원합니다.HTTP get 요청에 대상 URL과 API 노드를 연결하고 웹 스크레이퍼처럼 계속하는 것입니다.본 훈련에서 나는 어떻게 이 점을 해내는지 중점적으로 소개할 것이다😁.
this scraper API link와 판촉 코드 lewis10을 사용하면 첫 구매 시 10% 할인을 받을 수 있습니다!!
너는 그들의 아낌없는 무료 계획부터 시작하여 필요할 때 업그레이드할 수 있다.

1. 설정


우선, 우리는scrapy 라이브러리를 설치해야 한다.달아나다
pip install scrapy
그런 다음 scraper API website로 이동하여 API 키를 가져옵니다.우리는 매우 간단한 방식으로 그들의 서비스를 방문할 수 있도록 이것이 필요하다.그러니까 서둘러.

프로젝트 시작


이 두 단계를 완성하면 우리는 네트워크 파충류를 만들 수 있다.
실행 python scrapy startproject projectName이것은 우리의 프로젝트를 만들 것입니다. 이 프로젝트는 다음과 같은 구조로 초기화됩니다.

이제 재밌는 부분을 보도록 하겠습니다.
거미의 폴더에 파일을 만들고 이를 영화라고 명명할 것입니다.py.
이것은 우리의 네트워크 파충류에 필요한 대부분의 코드를 수용할 것이다.
우리의 전체 코드는 모두 이렇다.
from scrapy import Spider
from ..items import GetmoviesItem
from .config import API_KEY

class moviesCrawl(Spider):
    name="movies"
    page_number=15

    url_link="https://www.themoviedb.org/movie?page=1"

    start_urls=['http://api.scraperapi.com/?api_key='+ API_KEY + '&url=' + url_link + '&render=true']

    def parse(self,response):
        movies=response.css("div.item.poster.card")
        items=GetmoviesItem()
        for movie in movies:
            items["title"]=movie.css('.title.result::text').extract()
            items["rating"]=movie.css(".user_score_chart::attr(data-percent)").extract()
            items["description"]=movie.css(".overview::text").extract()
            items["poster_link"]=movie.css('.poster.lazyload.fade::attr(data-src)').extract()

            yield items


        next_page_url = "https://www.themoviedb.org/movie?page="+ str(self.page_number)
        next_page='http://api.scraperapi.com/?api_key='+ API_KEY + '&url='+ next_page_url + '&render=true'

        if self.page_number<=15:
            self.page_number+=1
            yield response.follow(next_page,callback=self.parse)
좀 무서워 보일 수도 있지만, 우리는 한 걸음 한 걸음 토론할 것이다.
세 줄은 라이브러리 가져오기와 프로젝트입니다. 기능이 정상적인 네트워크 파충류를 효과적으로 만들어야 합니다.
from scrapy import  Spider
from ..items import GetmoviesItem
from .config import API_KEY
이제 Getmovies Item 가져오는 것을 걱정하지 마세요. 곧 시작합니다.
필요한 구성을 저장하기 위해 별도의 파일을 만들었습니다.이런 상황에서
이것은 우리가 scraper API에서 얻은 API 키입니다.
class moviesCrawl(Spider):
    name="movies"

    url_link="https://www.themoviedb.org/movie?page=1"
    page_number=15

    start_urls=['http://api.scraperapi.com/?api_key='+ API_KEY + '&url=' + url_link + '&render=true']

이것이 바로 일이 재미있어지기 시작한 곳이다.먼저 moviesCrawl 클래스를 만듭니다. 이 클래스는 파일 맨 위에서 가져온 spider 클래스를 계승합니다.이 종류는 우리의 웹 스크레이퍼의 기초를 구성할 것이며, 우리는 여기서 웹 파충류의 행위를 지정할 것이다.
우리는 우선 그것의 이름을 지어야 한다. 이것은names 변수에서 완성된 것이다.스크레이퍼를 생성한 후 실행하려면 이 이름을 사용합니다.
url\ulink 변수는 우리가 긁으려는 URL을 가리키는 것입니다.너는 이것이 페이지를 나누는 사이트라는 것을 알아차릴 것이다. 그것은 다음과 같은 형식을 채택한다https://www.themoviedb.org/movie?page={{page_number}}page_number 변수는 이 모드를 사용하여 대상 사이트 내의 여러 페이지에서 스크레이퍼를 자동으로 이동합니다.
마지막으로 start\uurl 변수는 scrapy의 키워드입니다.이것은 URL 목록입니다. 특정한 URL이 지정되지 않았을 때, 기어오르기는 그 중에서 기어오르기 시작합니다.따라서 다운로드의 첫 번째 페이지는 여기에 열거될 것이다.
스크레이퍼 API를 사용하여 전력 효율 극대화😎, url\u 링크를 scraper API 단점과 연결하기만 하면 됩니다.http://api.scraperapi.com/?api_key='+ API_KEY + '&url=' + url_link + '&render=truerender=true 옵션은 scraper API에javascript 렌더링을 사용해서 헤더 없는 브라우저를 실행할 수 있도록 합니다.이것은 우리가 간략한 형식으로 소개한 내용이다.
def parse(self,response):
        movies=response.css("div.item.poster.card")
        items=GetmoviesItem()
        for movie in movies:
            items["title"]=movie.css('.title.result::text').extract()
            items["rating"]=movie.css(".user_score_chart::attr(data-percent)").extract()
            items["description"]=movie.css(".overview::text").extract()
            items["poster_link"]=movie.css('.poster.lazyload.fade::attr(data-src)').extract()

            yield items
scrapy 파일에 따르면,

The parse method is in charge of processing the response and returning scraped data and/or more URLs to follow.


간단하게 말하자면, 이것은 이런 방법을 사용하면 우리가 긁으려는 목표 사이트에서 받은 데이터를 처리할 수 있다는 것을 의미한다.지난 두 차례의 연습에서 우리는 웹 캡처를

The process of extracting information from a webpage by taking advantage of patterns in the web page's underlying code.
We can use web scraping to gather unstructured data from the internet, process it and store it in a structured format.


일단 우리가 웹 코드의 모델을 확정하면 우리는 데이터 추출을 자동화할 수 있다.이러한 DOM 요소를 확인해 보겠습니다.

위의 그림에서 우리는 모든 영화 항목이 하나의 유형 항목, 포스터와 카드의 구역에 포함되어 있음을 알아차릴 것이다.
이 정보가 있으면 파충류가 이 속성을 표시하는 모든 CSS 요소를 가져오도록 지시할 것입니다.
계속하기 전에 스크립트 시작 부분에 가져온 Getmovies Item 클래스를 처리합니다.
from scrapy import Item
class GetmoviesItem(scrapy.Item):
    # define the fields for your item here like:
    title=scrapy.Field()
    rating=scrapy.Field()
    description=scrapy.Field()
    poster_link=scrapy.Field()
일단 우리가 사이트 데이터에 대해 그물을 치면, 우리는 데이터를 구조화된 형식으로 어딘가에 저장해야 한다.이 items 대상은 스크래치 데이터를 수집하는 간단한 용기입니다.그것들은 사전과 유사한 API를 제공하고 사용 가능한 필드를 설명하는 편리한 문법을 제공한다.
이 수표에 대한 더 많은 정보here.
위의 코드에서 우리가 정의한 내용은 우리가 추출한 정보를 저장하는 사전 키와 같다.
우리 아직 흐르고 있나?너무 좋아요.우리는 계속 전진한다.
items 변수는 Getmovies Item의 인스턴스가 됩니다.여기에서 사전 키로 정의된 같은 필드 이름을 사용하면 모든 영화에서 단독 속성을 추출할 수 있습니다.등급 평가 정보의 한 예.이 속성은 클래스 이름이user\uscore\uchart인 요소에 저장됩니다.이 HTML 요소에는 "datapercent"속성이 있습니다. 이것이 바로 우리가attr 방법을 사용하여 그곳에 저장된 데이터에 접근하는 이유입니다.그곳에서 굴복 함수를 사용하면 우리는 지금 우리가 필요로 하는 모든 데이터를 얻을 수 있다.
코드의 마지막 부분에 대해
        next_page_url = "https://www.themoviedb.org/movie?page="+ str(self.page_number)
        next_page='http://api.scraperapi.com/?api_key='+ API_KEY + '&url='+ next_page_url + '&render=true'

        if self.page_number<=15:
            self.page_number+=1
            yield response.follow(next_page,callback=self.parse)
우리는 페이지 URL을 이용하여 임의의 여러 페이지에서 교체한다.다행히도 우리는 scraper API의 단점에 연결될 것이기 때문에 IP 주소가 차단될 위험이 없습니다. 왜냐하면 그들은 이미 우리를 위해 에이전트를 관리했기 때문입니다.
그러나 저는 여러분에게 웹 페이지를 캡처할 때 목표 사이트에 너무 많은 요청을 보내지 말라고 일깨워 드리겠습니다. 왜냐하면 이것은 다른 사람들이 플랫폼에서의 사용자 체험을 파괴할 수 있기 때문입니다.
마지막으로 선택한 파일 형식에 따라 이 명령 중 하나만 실행하면 정보를 저장할 수 있습니다.scrapy crawl movies -o filename.csv scrapy crawl movies -o filename.json scrapy crawl movies -o filename.xml

특징 평가


에이전트 기능


나는 httpbin을 사용하여 이 특성을 테스트했는데 여러 요청에서 IP 교환이 매우 잘 되었다.

주의해야 할 것은 IP 교환 과정에서 요청한 시간이 느려지기 때문에 웹 스크레이퍼의 운행 속도가 평소보다 느려진다는 것이다.

인증 코드


이 기능을 테스트하려면 인증 코드가 활성화된 사이트를 식별하고 스크립트를 실행하십시오.좋은 시작은 truepeoplesearch 인증코드 폼이 바로 튀어나오는 것이다.scraper API가 당신을 위해 이 문제를 쉽게 처리할 수 있다는 것을 발견하고 평소처럼 스크랩할 수 있습니다.

헤드 없는 브라우저


render=true를 삭제함으로써javascript를 대량으로 사용하는 사이트에서 스크립트를 실행하고 차이를 주의합니다.
좋은 출발점은 quotes to scrape js powered site이다.

결론


당신도 scrapy로 간단한 네트워크 파충류를 만들고 scraper API를 이용할 수 있기를 바랍니다.
더 많은 정보를 알고 싶으면 그들의 documentation 페이지를 방문하여 경외심을 불러일으키는 기능들을 보세요. 이 기능들은 웹 페이지를 캡처할 때 겪는 두통을 완화시킬 수 있습니다.
scrapy documentation .
시간 내주셔서 감사합니다.
더 많은 정보를 알고 싶으시면 제 newsletter 를 구독하여 제가 새로운 게시물을 올릴 때 알림을 받을 수 있도록 하세요.얘기하고 싶어요?전화해.

좋은 웹페이지 즐겨찾기