python 화 웨 이 응용 시장 평론

코드 공유
전체 항목 을 github 에 놓 았 습 니 다.python 3.7 에서 정상적으로 사용 할 수 있 습 니 다.문제 가 있 으 면 지적 해 주 십시오.
github 프로젝트 주소:https://github.com/LSY-C/scrapy_hauweiappstore_comment
각각 응용 정보 와 응용 평론 정 보 를 얻 었 는데 데이터 구 조 는 다음 과 같다.


1.Scrapy 프로젝트 설치 및 생 성
Scrapy 공식 문서:https://docs.scrapy.org/en/latest/intro/install.html
Scrapy 는 비교적 사용 하기 좋 은 python 파충류 프레임 워 크 로 공식 문서 도 비교적 상세 하 게 썼 다.다음 명령 을 직접 실행 하여 설치 할 수 있 습 니 다:

pip install Scrapy
설치 가 완료 되면 Scrapy 프로젝트 를 만들어 야 합 니 다.파충류 프로젝트 프레임 워 크 에 해당 합 니 다.프로젝트 를 설치 하고 싶 은 곳 에서 명령 행 을 열 고 다음 명령 을 입력 하면[procjectname]폴 더,예 를 들 어 내[procjectname]은 appstore 입 니 다.폴 더 에 자동 으로 생 성 되 는 파일 입 니 다.

scrapy startproject appstore
  • appstore/scrapy.cfg 에는 파충 류 를 시작 하 는 기본 설정 이 포함 되 어 있 으 며,일반적으로 신경 쓰 지 않 아 도 됩 니 다.
  • appstore/appstore/items.py:기어 오 른 데이터 형식 류 를 정의 합 니 다.이 안에 기어 오 른 데 이 터 를 저장 하 는 item 형식 을 만 듭 니 다.
  • appstore/appstore/middlewares.py:파충류 의 중간 키 의 일부 행 위 를 정 의 했 습 니 다.저도 보통 움 직 이지 않 습 니 다.
  • appstore/appstore/pipelines.py:item 에 올 라 가서 처리 하 는 것 을 정의 합 니 다.
  • appstore/appstore/settings.py:파충류 설정 파일 입 니 다.
  • appstore/appstore/spiders/:이 디 렉 터 리 에 저 장 된 것 은 파충류 입 니 다.즉,웹 페이지 에 요청 을 보 내 고 응답 을 받 은 후에 데이터 처 리 를 하 는 과정 입 니 다.
  • 2.응용 시장 평론 과정
    웹 페이지 정 보 를 얻 는 데 자주 사용 하 는 방법 은 두 가지 가 있다.
  • html 파일 을 xpath 로 직접 분석
  • 특정 형식 구조 요청 에 따라 제 이 슨 데 이 터 를 가 져 와 분석
  • 분명히 전 자 는 더욱 간단 하고 편리 하지만 현재 많은 웹 페이지 가 동태 적 이기 때문에 후자 의 범 용성 이 더욱 강하 다.여기 서 나 는 화 웨 이 응용 시장 에서 모든 응용 평론 정 보 를 얻 는 데 주로 다음 과 같은 방법 을 사용한다.
    1.스 크 래 피 파충류 운행 절차
    먼저 Scrapy 의 파충류 가 어떻게 작 동 하 는 지 대체적으로 알 아야 한다.다음 과 같은 몇 가지 절차 로 나 뉜 다.
  • Step 1:프로젝트 의 spiders 폴 더 에.py 파일 을 새로 만 듭 니 다.예 를 들 어 huawei.py.일반적으로 모든 파일 은 파충류,즉 특정한 웹 페이지 에 대한 기어 오 르 기 전략 을 대표 합 니 다.
  • Step 2:scrapy.Spider 에서 계승 할 클래스 를 만 듭 니 다.클래스 에 최소한 name,allowed 가 필요 합 니 다.domain、start_urls 변수 와 함수 parse(self).그 중에서 name 은 이 파충류 의 유일한 표지 입 니 다.그 다음 에 시작 할 때 지정 한 name 을 통 해 어떤 파충류 가 시작 되 는 지 판단 합 니 다.(spiders 폴 더 에 여러 개의 파충류 파일 이 포함 되 어 있 을 수 있 기 때 문 입 니 다)allowed_domain 은 현재 파충류 가 접근 할 수 있 는 주 도 메 인 이름 을 지정 합 니 다.start_urls 는 먼저 가 져 온 페이지 를 지정 하 는데 사용 되 며,이 가 져 온 결 과 는 parse 함수 에 의 해 처 리 됩 니 다.파충류 마다 처리 함수 가 많 을 수 있 습 니 다.이름 형식 은 보통 parse 입 니 다.xxx 와 같은 것 은 다단 계 페이지 를 처리 하 는 데 사 용 됩 니 다.예 를 들 어 parse 가 홈 페이지 를 처리 한 후에 새로운 요청 을 구성 하여 2 급 페이지 정 보 를 얻 고 parsesecond 는 처리 하지만 어떻게 든 parse 함 수 를 포함 합 니 다.
  • 
    import scrapy
    class HuaWei(scrapy.Spider):
        name = "huawei"
        allowed_domains = ['appstore.huawei.com', 'web-drcn.hispace.dbankcloud.cn']
        start_urls = [
            'https://web-drcn.hispace.dbankcloud.cn/uowap/index?method=internal.getTemplate&serviceType=20&zone=&locale=zh']
    
        def parse(self, response):
        	pass
    
  • step 3:파충류 가 작성 한 후 프로젝트 루트 디 렉 터 리(즉 scrapy.cfg 파일 의 동급 디 렉 터 리)에서 명령 행 을 열 고 다음 명령 을 입력 하여 파충 류 를 시작 합 니 다.
  • 
    scrapy crawl hauwei
    
    2.페이지 분석
    먼저,브 라 우 저 를 통 해 응용 시장 을 방문 하여 웹 페이지 의 기본 정 보 를 분석 하고 자 합 니 다.여기 서 저 는 응용 시장 에서 모든 응용 평론 을 얻 고 싶 습 니 다.그래서 먼저 모든 응용 프로그램의 상세 한 인터페이스 에 들 어간 다음 에 상세 한 인터페이스 에서 평론 을 펼 쳐 서 얻 어야 합 니 다.기본 적 인 사 고 는 모든 분류 C>모든 하위 분류 C>모든 응용 C 를 펼 치고 모든 댓 글 을 가 져 오 는 것 입 니 다.



    기어 오 르 는 초기 페이지 는https://appgallery.huawei.com/#/Apps입 니 다.브 라 우 저 에서 F12 를 사용 하여 개발 자 모드 를 시작 하고 웹 페이지 전단 코드 를 디 버 깅 합 니 다.우 리 는 페이지 레이아웃 의 일부 규칙 을 찾 을 수 있 기 를 바 랍 니 다.
    페이지 분석 프로 세 스 1
    우 리 는 분 류 를 응용 하 는 옵션 에서 어떤 분류 나 하위 분 류 를 선택 하 더 라 도 url 은 변 하지 않 는 다 는 것 을 발견 했다.즉,분 류 를 선택 한 후에 해당 하 는 응용 목록 을 표시 하 는 기능 은 동태 적 으로 이 루어 진 것 이다.우 리 는 html 의 정 보 를 캡 처 하여 서로 다른 분류의 응용 목록 을 얻 을 수 없다.그러면 우 리 는 자신의 구조 요청 을 통 해 json 데 이 터 를 얻 는 방식 으로 정 보 를 얻 을 수 밖 에 없다.
    우선,디 버 깅 창 에 있 는 Network 옵션 을 열 어 서로 다른 분류 응용 목록 을 가 져 올 때의 네트워크 패 킷 을 분석 합 니 다.

    첫 번 째 패 킷 을 제외 하고 뒤에 있 는 것 은 모두 응용 아이콘 데 이 터 를 가 져 오 는 것 입 니 다.즉,첫 번 째 패 킷 에는 응용 되 는 다른 데이터 가 포함 되 어 있 습 니 다.이 패 킷 의 request 를 보십시오.url:
    
    https://web-drcn.hispace.dbankcloud.cn/uowap/index
    ?method=internal.getTabDetail
    &serviceType=20
    &reqPageNum=1
    &uri=8e62cf6d238c4abdb892b400ff072f43
    &maxResults=25
    &zone=
    &locale=zh
    
    저 희 는 브 라 우 저 에서 이 url 을 직접 방문 하면 json 파일 을 얻 을 수 있 습 니 다.분석 한 결과 이 json 파일 에는 목록 에 응 용 된 정보 가 포함 되 어 있 습 니 다.서로 다른 분류,하위 분 류 를 클릭 하여 서로 다른 request 획득url,우 리 는 모든 하위 분류의 request 를 발견 했다.url 은 uri 필드 만 다 르 고 기본 적 인 상황 은 1 페이지 의 25 개의 응용 만 표시 합 니 다.그 러 니까 우리 가 이 걸 로 requesturl 은 템 플 릿 입 니 다.uri 필드 를 수정 하여 다양한 종류의 응용 목록 을 가 져 오고 reqPageNum 필드 를 수정 하여 목록 의 여러 페이지 를 가 져 옵 니 다.
    페이지 분석 과정 2
    수 동 으로 모든 응용 프로그램의 상세 한 인터페이스 에 들 어 갈 때 우 리 는 서로 다른 응용 상세 한 인터페이스의 url 은 마지막 위치 만 다르다 는 것 을 발견 했다.예 를 들 어 텐 센트 영상 과 유쿠 영상 이라는 두 응용 상세 한 인터페이스의 url 은 각각 다음 과 같다.

    몇 개의 응용 프로그램 을 더 살 펴 보면 마지막 코드 는 유일한 식별 자 를 응용 하 는 것 과 유사 한 것 임 을 알 수 있다.이전 단계 에서 우 리 는 얻 은 모든 응용 정보 에 이러한 식별 자('appid'키 의 값)를 찾 을 수 있 음 을 발견 할 수 있 습 니 다.그래서 저 는 여기 서 직접 이런 형식 으로 url 을 구성 하여 페이지 를 가 져 오 라 고 요 청 했 지만 실 패 했 습 니 다.페이지 의 방향 을 바 꾸 는 문제 일 수도 있 습 니 다.어 쩔 수 없 이 순서대로 다른 방식 으로 계속 분석 할 수 밖 에 없 었 습 니 다.
    F12 를 통 해 페이지 레이아웃 을 볼 수 있 습 니 다.모든 app 카드 에는 app 이름과 다른 정보 가 있 지만 app 상세 페이지 의 링크 를 찾 을 수 없습니다.상세 한 정 보 를 얻 는 기능 은 js 동적 으로 얻 은 것 으로 기록 되 어 있 기 때문에 html 인터페이스 에서 직접 얻 을 수 없 기 때문에 구조 request 를 사용 합 니 다.url 방법 으로 json 데 이 터 를 가 져 옵 니 다.

    분석 과정 과 유사 하여 우 리 는 아래 의 request 를 얻 을 수 있 습 니 다.url:
    
    https://web-drcn.hispace.dbankcloud.cn/uowap/index
    ?method=internal.getTabDetail
    &serviceType=20
    &reqPageNum=1
    &maxResults=25
    &uri=app%7CC174391
    &shareTo=
    &currentUrl=https%253A%252F%252Fappgallery.huawei.com%252F%2523%252Fapp%252FC174391
    &accessId=
    &appid=C174391
    &zone=
    &locale=zh
    
    이 requesturl 에서 얻 은 json 에는 응용 에 대한 상세 한 정보 가 포함 되 어 있 습 니 다.실제 테스트 를 통 해 reqPageNum,max Results,shareto,currentUrl,accessId,appid,zone,locale 필드 는 모두 필요 하지 않 습 니 다.그리고 uri 필드 뒤의"C174391"은 현재 응용 되 고 있 는 appid 입 니 다.즉,uri 필드 의'app%7C'뒤의 문자열 을 서로 다른 응용 프로그램 인 appid(분석 과정 1 의 json 파일 에서 얻 을 수 있 음)로 수정 하면 서로 다른 응용 프로그램의 상세 한 정 보 를 얻 을 수 있 습 니 다.
    페이지 분석 과정 3
    위 에서 두 번 분석 한 경험 이 있 습 니 다.우 리 는 모든 응용 프로그램의 평론 데 이 터 를 계속 얻 었 습 니 다.이런 데이터 도 js 동 태 를 통 해 얻 은 것 을 발견 하고 request 를 계속 분석 합 니 다.url,형식 은 다음 과 같 습 니 다:
    
    https://web-drcn.hispace.dbankcloud.cn/uowap/index
    ?method=internal.user.commenList3
    &serviceType=20
    &reqPageNum=1
    &maxResults=25
    &appid=C2002
    &version=10.0.0
    &zone=
    &locale=zh
    
    이전 과 마찬가지 로 우 리 는 appid 필드 를 수정 하여 서로 다른 응용 프로그램의 댓 글 을 얻 을 수 있 고 reqPageNum 필드 를 수정 하여 여러 페이지 의 댓 글 을 얻 을 수 있 습 니 다.
    3.파충류 실현
    전체 기어 오 르 는 과정 은:구조 requesturl 요청 json 데이터 가 져 오기 C>json 데이터 분석 C>새로운 requesturl json 데이터 가 져 오기 C>...
    다음은 파충류 의 처리 함수 입 니 다.모든 응용 프로그램의 상세 한 정 보 를 처리 하고 댓 글 을 얻 는 request 를 구성 하 는 기능 입 니 다.url 에서 새로운 요청 을 보 내 고 그 중의 관건 적 인 부분 을 차례대로 설명 합 니 다.
    
    def app_parse(self, response):
        """
            ,      、  、  、  、   ,    appcomment_parse    
        :param resonse:
        :return:
        """
        appid = response.meta['appid']
        app_json = json.loads(response.text)
        Name = app_json.get('layoutData')[0].get('dataList')[0].get('name')
        Star = app_json.get('layoutData')[0].get('dataList')[0].get('intro')
        Downloads = app_json.get('layoutData')[0].get('dataList')[0].get('stars')
        Price = app_json.get('layoutData')[3].get('dataList')[0].get('tariffDesc')
        Version = app_json.get('layoutData')[3].get('dataList')[0].get('version')
        Developer = app_json.get('layoutData')[3].get('dataList')[0].get('developer')
        Description = app_json.get('layoutData')[7].get('dataList')[0].get('appIntro').replace('
    ', '') AppData = AppItem( AppId=appid, AppName=Name, AppDesc=Description, AppPrice=Price, AppVersion=Version, AppDeveloper=Developer, AppStar=Star, AppDownloads=Downloads ) yield AppData for pagenum in range(1, 20): request_url = "https://web-drcn.hispace.dbankcloud.cn/uowap/index?method=internal.user.commenList3&serviceType=20&reqPageNum={}&maxResults=25&appid={}&version=10.0.0&zone=&locale=zh".format( pagenum, appid) yield scrapy.Request(url=request_url, callback=self.appcomment_parse, meta={'appid': appid})
    json 분석 및 구조 요청
    여덟 번 째 줄 에 서 는 json.loads 를 통 해 응답 을 json 형식 으로 해석 하고 나중에 키 값 과 index 를 사용 하여 정 보 를 방문 합 니 다.
    items 에 데이터 저장
    items.py 파일 에서 Item 류 를 정의 한 후 이 곳 에서 Item 대상 을 새로 만 들 고 해당 하 는 값 을 입력 하여 이 item 을 pipeline.py 에 되 돌려 처리 할 수 있 습 니 다.
    
    # items.py
    class AppItem(scrapy.Item):
        AppId = scrapy.Field()
        AppName = scrapy.Field()
        AppDesc = scrapy.Field()
        AppPrice = scrapy.Field()
        AppVersion = scrapy.Field()
        AppDeveloper = scrapy.Field()
        AppStar = scrapy.Field()
        AppDownloads = scrapy.Field()
    
    yield 는 python 의 키워드 입 니 다.return 과 유사 합 니 다.함 수 는 이 키워드 가 수식 하 는 표현 식 값 을 되 돌려 줍 니 다.return 과 달리 yield 는 한 값 을 되 돌려 준 후에 뒤의 코드 를 계속 실행 합 니 다.return 은 그렇지 않 습 니 다.
    새로운 요청 을 구성 하 다
    마지막 줄 에서 모든 댓 글 목록 에 대한 새로운 requesturl 은 댓 글 정 보 를 얻 고 scrapy.Request 를 통 해 요청 을 보 냅 니 다.이 요청 응답 을 처리 할 처리 함 수 를 지정 합 니 다.meta 에는 callback 함수 에 전달 하고 자 하 는 정보 가 포함 되 어 있 습 니 다.
    item 데이터 처리
    데 이 터 를 추출 하 는 과정 에서 처리 함 수 는 실시 간 으로 서로 다른 item 을 되 돌려 주 고 pipeline 에 맡 겨 처리 합 니 다.이 때 는 pipeline.py 에서 이 item 을 어떻게 처리 하 는 지 지정 해 야 합 니 다.예 를 들 어 제 가 데 이 터 를 모두 csv 표 에 기록 해 야 합 니 다.pipeline 클래스 에서 process 를 정의 해 야 합 니 다.item 함수 가 모든 item 을 처리 하고init__closespider 는 모두 선택 할 수 있 습 니 다.
    
    class AppStorePipeline:
        def __init__(self):
            self.app_list = []
            self.comment_list = []
    
        def process_item(self, item, spider):	#    item      
            if isinstance(item, AppItem):
                self.app_list.append(dict(item))
            elif isinstance(item, CommentItem):
                self.comment_list.append(dict(item))
            return item
    
        def close_spider(self, spider):			#            
            df_app = pd.DataFrame(self.app_list)
            df_comment = pd.DataFrame(self.comment_list)
            df_app.to_csv('app_info.csv')
            df_comment.to_csv('comment_info.csv')
    
    이상 은 python 이 화 웨 이 응용 시장 평론 을 얻 는 상세 한 내용 입 니 다.더 많은 python 이 화 웨 이 응용 시장 을 얻 는 것 에 관 한 자 료 는 우리 의 다른 관련 글 을 주목 하 세 요!

    좋은 웹페이지 즐겨찾기