Python BeautifulSoup получить html со страницы Dynami c - PullRequest
0 голосов
/ 09 июля 2020

вопрос о синтаксическом анализе html с веб-страницы Dynami c, которую нужно прокрутить вниз.

Я знаю, что будет проще использовать селен. но я не хочу использовать селен по нескольким причинам.

в любом случае. вот мой код.

keyword_list = "abc"
response = requests.get('https://search.shopping.naver.com/search/all.nhn?origQuery={key}&pagingIndex={page}&pagingSize=40&viewType=list&sort=rel&frm=NVSHPAG&query={key}'.format(key=keyword_list, page=2), timeout=100)
soup = BeautifulSoup(response.text, 'html.parser')
product_names = soup.find_all('a', attrs={'class': lambda e: e.startswith('basicList_link__1MaTN') if e else False})

, но эту веб-страницу нужно прокрутить вниз, чтобы получить HTML полностью. Я пробовал смотреть chrome сетевой ответ инструмента разработчика при прокрутке вниз. но не смог найти решение.

кто-нибудь может мне помочь?

редактировать ---------------------- когда я прокручиваю вниз. единственное, что я вижу в инструменте разработчика, это введите описание изображения здесь

1 Ответ

0 голосов
/ 09 июля 2020

Я не был уверен, нужны ли ему все заголовки и файлы cookie, поэтому я начал с Session(), а позже я не проверял, могу ли я его пропустить.

URL-адреса дают HTML, но сервер отправляет их как JSON, поэтому я начинаю поиск в HTML и нашел JSON данные в

<script id="__NEXT_DATA__" type="application/json">

А затем я получаю их и использую модуль json для преобразования в словарь Python.

Самой большой проблемой было найти интересные данные во всей этой информации.

import requests
from bs4 import BeautifulSoup
import json

s = requests.Session()
s.headers.update({'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:80.0) Gecko/20100101 Firefox/80.0'})

# main page to get cookies
url = 'https://shopping.naver.com/'
r = s.get(url)

# search
query = 'test'

# I skip this part - it needs normal BeautifulSoup to get data
#url = 'https://search.shopping.naver.com/search/all?cat_id=&frm=NVSHATC&query={}'.format(query)
#r = s.get(url, timeout=100)
#print(r.status_code)

for page in range(1, 3):
    print('--- page', page, '---')
    
    url = 'https://search.shopping.naver.com/search/all?frm=NVSHATC&origQuery=test&pagingIndex={}&pagingSize=40&productSet=total&query={}&sort=rel&timestamp=&viewType=list'.format(page, query)
    r = s.get(url, timeout=100)
    
    #print(r.status_code)
    
    soup = BeautifulSoup(r.content, 'html.parser')

    # gives only 5 items    
    #for ul in soup.find_all('ul', {'class': 'list_basis'}):
    #    for li in ul.find_all('li'):
    #       print(li.text)
    #        print('---')
    #    print('----------------')

    script = soup.find('script', {'id': '__NEXT_DATA__'})
    
    data = json.loads(script.text)        
 
    #print(data.keys())
    #print(data['query'].keys())    
    #print(data['props']['initialProps'].keys())
    #print(data['props']['pageProps'].keys())    
    #print(data['props']['initialState'].keys())    
    
    #print(json.dumps(data['props']['pageProps']['initialState']['products']['list'], indent=2))    
    
    products = data['props']['pageProps']['initialState']['products']['list']
    
    print('len(products):', len(products))
    
    for item in products:
        #print(item['item'].keys())
        print('productName:', item['item']['productName'])
        #for key, value in item['item'].items():
        #    print(key, '=', value)

Результат:

--- page 1 ---

len(products): 40

productName: 염소농도 테스트 페이퍼 CM-240 (Chorine Test Paper)
productName: P30-Bact 박테리아 검사키트, Bacteria Test Kit 수질검사키트 ITS
productName: JT602A 테스터 팁잭 JT-602A Test Tip Jack
productName: Pro’skit MT-3102 3 1/2 2A Mini hook table attached to the temperature test probe
productName: FLUKE TL75 TEST LEAD 테스트리더
productName: DC 2CM/건식 가스미터 가스미타 DRY TEST GAS METER
productName: 다다 다다 리드선 MET-500용 리드선 TEST LEAD
productName: (신길테크) FLUKE ES165X EARTH SPIKE TEST KIT
productName: 14 플라스틱 수분계 테스트 용기 14 Plastic Hydrometer Test Jar
productName: [TESTO] 테스토 / TEST 175-T2 / 2채널 온도 데이터로거
productName: tH1UV9 잔류염소 TEST 롤형 염소농도 테스트지 1p
productName: [관부가세포함] ZEISS Siemens Star Test Chart
productName: 휴대용 산도계(TEST KIT)
productName: [프로텍] 리드선(TEST LEAD) / 아날로그용
productName: Zeyuan 용접 게이지 용접 천사 검사 게이지 Ulnar Test Ruler
productName: UEi Test Instruments Em201Spkit 정전기 압력 키트
productName: 14 플라스틱 수분계 테스트 용기 14 Plastic Hydrometer Test Jar
productName: Clearblue Digital Pregnancy Test 테스트기 5개입
productName: Cal Test CT3681 오실로스코프 고전압 차동프로브 70MHz
productName: 원포 패스터 임신테스트기 임테기 1test x 10박스
productName: (관부가세포함) INSIZE 6293-3 Dial Test Indicator Holder
productName: SAMDUK 눈금시험관 시험관 Graduated Test Tube
productName: [계측기코리아] HIOKI L4938 TEST PIN SET 리드선
productName: Ars50-Quic2, 지하수,유해물질 비소검사, Arsenic Test Kit
productName: 금속 성분분석기 ,SPECTRO TEST
productName: [ACUBA] 아쿠바 PH 테스트페이퍼 스틱형 100개입 - PH TEST PAPER
productName: FLUKE 700PTP-1 공압식 테스트펌프 Pneumatic Test Pump
productName: [ADVANTEC] PH시험지(PH Test Paper)
productName: MQuant Total Hardness Test 총경도 테스트지
productName: SureGrip Industrial Test Lead Set Fluke FLUTL222
productName: TOYOTECH TL-700 LCR-METER TEST LEAD 액세서리
productName: 염소농도 테스트 페이퍼 CM-240 (Chorine Test Paper)
productName: 이가게뭐야 랜 테스터기 POE 전압체크 Ping test지원
productName: [플루크] TL75 테스트 리드 세트 / TEST LEAD SET / FLUKE 테스터기용 리드선
productName: KYORITSU 교리츠 교리쯔 PACK TEST 간이 수질검사팩
productName: TEST 606-2 디지털 목재수분계 독일 포켓용 수분계
productName: IKA MS1.32 Test tube insert Φ12mm 6개
productName: Muscletech Test HD 하드코어 테스토스테론 부스터 90
productName: Arcotest 친환경 다인펜 (Test Pen PINK) -표준세트(8개)
productName: 랜테스터기 POE 전압체크 Ping test지원 케이블탐지

--- page 2 ---

len(products): 40

productName: HI3810 용존산소 측정키트 Oxygen Chemical Test Kit
productName: DC2C/건식 가스미터 가스미타 DRY TEST GAS METER
productName: 다다 다다 리드선 MET-500용 리드선 TEST LEAD
productName: 다다 다다 리드선 MET-500용 리드선 TEST LEAD
productName: KYORITSU PACK TEST 간이 수질검사팩
productName: [ACUBA] 아쿠바 PH TEST PAPER (PH 테스트 시험지) 50개입
productName: 샘아쿠아 API Ph Test Kit pH 테스트 키트/ 물 수질 측정
productName: BK Precision TL89S1 SMD Test Fixture (테스트 픽스쳐)
productName: 10ml 유리 테스트 컬쳐 튜브 Test tube, Glass
productName: 라텍스kit 살모넬라용 100test
productName: PKG575464잔류염소 테스트지 롤형 TEST 1p 염소농도
productName: [독일] Phoenix Contact Multimeter Test Fox M-1, 1212209
productName: [프로텍] 리드선(TEST LEAD) / 디지털용
productName: UEi Test Instruments Digital 검정
productName: [TOYOTECH] 도요테크 / TOYOTECH TEST LEAD / 각종 테스트 리드선
productName: 이상적인 산업 C-90 모든 Vol-Con 및 Vol-Test 전압 테스터와 함께 사용할
productName: OTC 3587 터미널 테스트 키트 OTC 3587 Terminal Test Kit
productName: 세이플린 임신진단 테스트기 1TEST x3개 /임테기
productName: Cal Test CT3687 오실로스코프 차동프로브 100MHz
productName: pH Test paper / ADVANTEC / BCG pH 4.0-5.6
productName: [계측기코리아] HIOKI L2200 TEST LEAD 테스트 리드
productName: pH농도 측정시험지 유니버셜-UNIV(pH test paper)측정범위 PH1~11
productName: (관부가세포함) YSI Photometer Test Kit - YPM114
productName: FA-1290 테스터 리드봉 (PT-802) Test Leads
productName: B50-Brom 브롬검사키트, Bromine Test Kit ITS 측정키트
productName: IKA VG3.33 Test tube insert Φ12mm 12개
productName: [플루크] TL71 / Fluke Premium Test Lead Set / 테스터리드 / DMM용 프리미엄 테스트리드선
productName: [ACUBA] 아쿠바 PH 테스트페이퍼 스틱형 100개입 - PH TEST PAPER
productName: BK Precision TL 1 Sheathed Test Lead Set (테스트 리드)
productName: DC 5C M/건식 가스미터 가스미타 DRY TEST GAS METER
productName: 다다 다다 리드선 MET-500용 리드선 TEST LEAD
productName: TEST 606-2 디지털 목재수분계 독일 포켓용 수분계
productName: 라인샵-TEST 606-2 디지털 목재수분계 독일 포켓용 수
productName: [독일] FLUKE TL175 - Twistguard test tips
productName: 잔류염소 TEST 롤형 염소농도 테스트지 1p
productName: [태광] 리드선(TEST LEAD) / 포켓용 외
productName: UEi Test Instruments Digital 검정
productName: 월드몰   G102 103 로즈골드 다리 높은 1200 거실수납장 TEST
productName: 14 플라스틱 수분계 테스트 용기 14 Plastic Hydrometer Test Jar
productName: 세이플리 임신진단 테스트기 1TEST x3개 /임테기
...