투 도 를 위해,이모 티 콘 을 기어 오 르 자.

4856 단어 파충
기어 오 르 는 사이트 주소:http://www.doutula.com/photo/list/?page= 이번 에는 주로 다 중 스 레 드 파충 류 를 배우 고 quue 대열 의 생산자 와 소비자 모델 을 사용한다.사이트 분석:이 사이트 의 구 조 는 비교적 간단 하 다.위의 사이트 뒤에 1 을 더 하면 첫 페이지 를 나타 내 고 2 를 더 하면 두 번 째 페이지 를 나타 내 는 것 으로 유추 된다.데이터 도 requests 로 직접 접근 할 수 있 습 니 다.파충류 에 대한 조 치 는 없 지만 천천히 올 라 가 야 합 니 다.너무 빠 르 면 문제 가 생 길 수 있 습 니 다.내 가 사용 하 는 다 중 스 레 드 방법 은 200 페이지 의 이모 티 콘 을 기어 올 라 갔다.구체 적 인 코드 는 다음 과 같 습 니 다.주 함수:먼저 Queue 모듈 을 통 해 각 페이지 의 이모 티 콘 을 저장 할 수 있 는 200 개의 대기 열 을 구축 하여 모든 이모 티 콘 의 주 소 를 추출 합 니 다.이모 티 콘 을 저장 할 수 있 는 1000 개의 대기 열 을 만 들 고 로 컬 에 다운로드 할 수 있 습 니 다.그리고 for 순환 을 사용 하여 200 페이지 의 인터넷 주 소 를 구축 하고 page 에 저장 합 니 다.queue 대기 열 중.마지막 으로 다섯 명의 생산자 와 다섯 명의 소비 자 를 구축 하고 시동 을 건다.
def main():
    page_queue = Queue(200)
    img_queue = Queue(1000)
    url_s = "http://www.doutula.com/photo/list/?page="
    for i in range(1, 201):
        url = url_s + str(i)
        page_queue.put(url)

    for i in range(5):
        t = Producter(page_queue, img_queue)
        t.start()
    for i in range(5):
        t = Consumer(page_queue, img_queue)
        t.start()
      
if __name__ == '__main__':
    main()

생산자 함수(Thread 모듈 계승):처음에 보험 을 들 었 을 때 저 는 headers 요청 헤드 를 구축 할 때 많은 정 보 를 추 가 했 습 니 다.User-agent,Accept,Cookie 를 포함 합 니 다.그리고 초기 함 수 를 구축 하고 슈퍼 를 사용 하여 부모 클래스 를 호출 하여 대상 을 변환 합 니 다.상세 한 해석 을 나 는 주석 에 썼 다.
class Producter(threading.Thread):
    Headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36",
        "Accept": r"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
        "Cookie": "__cfduid=d8249568756fd0d224d02db36892b6a601558100044; UM_distinctid=16ad4b7a705a24-06142f93c274de-353166-144000-16ad4b7a706a56; _ga=GA1.2.859291572.1558346967; _gid=GA1.2.1511793670.1558346967; yjs_id=3c0fb66a6388207a130a52420586feb2; ctrl_time=1; XSRF-TOKEN=eyJpdiI6IjFuS2U2eEZqM1JCNFhDaUFObkpDS0E9PSIsInZhbHVlIjoidXR0bWx6UHVNWTUxdFlyWEl6THFsXC9UVUkxODRPaVVpcEIyM1NyNDJoSU96cWc1c29VcDg5VG5vTjlZblJMTlwvIiwibWFjIjoiYzg3OGRkOTQ3YWE2Nzk1YWU4ZTdlMzMyMjE4MTNiMDMzZTY0ODdkYzA0ODc5NGUwYTM5NjBkN2ZlOGVlN2JiMiJ9; doutula_session=eyJpdiI6InRod2pjNEpXQnNcL0RKYml2dGMzb2NRPT0iLCJ2YWx1ZSI6ImlaVE8yOXhVTVNoR0ZHWVRra2RsaTJieFlhVUdBZ3BZUllzdW5OZVJCWVRDT2pJckdsT2dneWdaeDdNWDhxazEiLCJtYWMiOiIwN2RhNmE0NjFhZTJjOTRmMzdhMThkZmJhNjYzNGMxYzA1M2RjYjcwZDg1NjcxMjQ0OWU3MDEyMjI5YzM0NzQ1In0%3D; CNZZDATA1256911977=1301539121-1558343450-%7C1558358613"
    }
    def __init__(self, page_queue, img_queue, *args, **kwargs):
        super(Producter, self).__init__(*args, **kwargs)
        self.page_queue = page_queue
        self.img_queue = img_queue
    def run(self):
        while True:
            if self.page_queue.empty():  #        
                break
            url = self.page_queue.get()   # page_  url
            self.parse_url(url)
    def parse_url(self, url):    #     url    
        response = requests.get(url, headers=self.Headers)
        html = etree.HTML(response.text)
        imgs = html.xpath("//div[@class='page-content text-center']//a//img")
        for img in imgs:
            url_img = img.get("data-original")
            alt = img.get("alt")
            try:
                suffix = os.path.splitext(url_img)[1]  #  os         
            except:
                continue
            filename = alt + suffix
            self.img_queue.put((url_img, filename))    #                  img_queue   
            time.sleep(0.5)

소비자 함수(Thread 모듈 계승):초기 함수 의 구축 은 생산자 와 마찬가지 로 request 모듈 의 url retrieve 함 수 를 사용 하여 이모 티 콘 을 로 컬 에 다운로드 합 니 다.이모 티 콘 의 이름 이 파일 이름 을 구성 할 수 없 는 것 에 대해 서 는 필요 없습니다.사실 페이지 는 replace 함수 나 re 모듈 의 sub 함 수 를 사용 하여 처리 할 수 있 습 니 다.
class Consumer(threading.Thread):
    def __init__(self,page_queue, img_queue, *args, **kwargs):
        super(Consumer, self).__init__(*args, **kwargs)
        self.page_queue = page_queue
        self.img_queue = img_queue
    def run(self):
        while True:
            if self.page_queue.empty() and self.img_queue.empty():  #              
                break
            url_img, filename = self.img_queue.get()
            try:
                request.urlretrieve(url_img, r"C:\Users\juno\Desktop\PYTHOY\python3-reptlie\test/" + filename)
                print(filename + "    ")
            except FileNotFoundError:
                continue
            time.sleep(0.5)

마지막 으로 이번 파충류 가 사용 하 는 창고:
import requests
from lxml import etree
from urllib import request
import os
import time
import threading
from queue import Queue

기어 오 르 는 결과:결국 6 천 여 개 를 기어 오 르 지 않 고 밤 에 도 자야 한다(⊙⊙).

좋은 웹페이지 즐겨찾기