简体   繁体   English

Python BeautifulSoup 从动态页面获取 html

[英]Python BeautifulSoup get html from dynamic page

question about parse html from dynamic webpage which need to scroll down.关于从需要向下滚动的动态网页解析 html 的问题。

I know it will be easier to use selenium.我知道使用 selenium 会更容易。 but I don't want to use selenium because few reasons.但我不想使用 selenium 因为几个原因。

any way.反正。 here is my code.这是我的代码。

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})

but this webpage needs to scroll down to get entire HTML.但是这个网页需要向下滚动才能获得整个 HTML。 I have tried look chrome developer tool's network response when I scroll down.当我向下滚动时,我尝试过查看 chrome 开发人员工具的网络响应。 but couldn't find solution.但找不到解决方案。

anyone can help me?任何人都可以帮助我吗?

edit ---------------------- when I scroll down.编辑 ---------------------- 当我向下滚动时。 only thing I can see at developer tool is this我在开发者工具上唯一能看到的是这个在此处输入图像描述

I wasn't sure if it needs all headers and cookies so I started with Session() and later I didn't check if I can skip it.我不确定它是否需要所有标题和 cookies 所以我从Session()开始,后来我没有检查是否可以跳过它。

Urls give HTML but server sends them as JSON so I start searching in HTML and I found JSON data in网址给出 HTML 但服务器将它们作为 JSON 发送,所以我开始在 HTML 中搜索,我在 AAD7A 中找到 Z0ECD11C1D7A287401F8Z14 数据

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

And then I get it and use module json to convert to Python's dictionary.然后我得到它并使用模块json转换为 Python 的字典。

The biggest problem was to find interesting data in all these information.最大的问题是在所有这些信息中找到有趣的数据。


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)

Result:结果:

--- 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개 /임테기

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM