簡體   English   中英

當 url 保持不變時,無法從網頁的第二頁抓取名稱

[英]Unable to scrape names from the second page of a webpage when the url remains unchanged

我正在嘗試使用請求模塊從網頁的第二頁中抓取不同的機構名稱。 我可以通過向 url 發送 get 請求來解析它的登陸頁面中的名稱。

但是,當涉及到從它的第二頁和后者訪問名稱時,我需要發送 post http 請求以及適當的參數。 我試圖完全按照我在開發工具中看到的方式來模仿發布請求,但我得到的回報如下:

<?xml version='1.0' encoding='UTF-8'?>
<partial-response id="j_id1"><redirect url="/ptn/exceptionhandler/sessionExpired.xhtml"></redirect></partial-response>

這是我嘗試過的方式:

import requests
from bs4 import BeautifulSoup
from pprint import pprint

link = 'https://www.gebiz.gov.sg/ptn/opportunity/BOListing.xhtml?origin=menu'
url = 'https://www.gebiz.gov.sg/ptn/opportunity/BOListing.xhtml'

with requests.Session() as s:
    s.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'
    r = s.get(link)
    soup = BeautifulSoup(r.text,"lxml")

    payload = {
        'contentForm': 'contentForm',
        'contentForm:j_idt171_windowName': '',
        'contentForm:j_idt187_listButton2_HIDDEN-INPUT': '',
        'contentForm:j_idt192_searchBar_INPUT-SEARCH': '',
        'contentForm:j_idt192_searchBarList_HIDDEN-SUBMITTED-VALUE': '',
        'contentForm:j_id135_0': 'Title',
        'contentForm:j_id135_1': 'Document No.',
        'contentForm:j_id136': 'Match All',
        'contentForm:j_idt853_select': 'ON',
        'contentForm:j_idt859_select': '0',
        'javax.faces.ViewState': soup.select_one('input[name="javax.faces.ViewState"]')['value'],
        'javax.faces.source': 'contentForm:j_idt902:j_idt955_2_2',
        'javax.faces.partial.event': 'click',
        'javax.faces.partial.execute': 'contentForm:j_idt902:j_idt955_2_2 contentForm:j_idt902',
        'javax.faces.partial.render': 'contentForm:j_idt902:j_idt955 contentForm dialogForm',
        'javax.faces.behavior.event': 'action',
        'javax.faces.partial.ajax': 'true'
    }

    s.headers['Referer'] = 'https://www.gebiz.gov.sg/ptn/opportunity/BOListing.xhtml?origin=menu'
    s.headers['Faces-Request'] = 'partial/ajax'
    s.headers['Origin'] = 'https://www.gebiz.gov.sg'
    s.headers['Host'] = 'www.gebiz.gov.sg'
    s.headers['Accept-Encoding'] = 'gzip, deflate, br'

    res = s.post(url,data=payload,allow_redirects=False)
    # soup = BeautifulSoup(res.text,"lxml")
    # for item in soup.select(".commandLink_TITLE-BLUE"):
    #     print(item.get_text(strip=True))
    print(res.text)

當 url 保持不變時,如何從網頁的第二頁解析名稱?

您可以使用 Selenium 在頁面之間進行遍歷。 以下代碼將允許您執行此操作。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.options import Options
import time


chrome_options = Options()
#chrome_options.add_argument("--headless")
#chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36")


driver = webdriver.Chrome(executable_path="./chromedriver", options=chrome_options)
driver.get("https://www.gebiz.gov.sg/ptn/opportunity/BOListing.xhtml?origin=menu")

#check if next page exists
next_page = driver.find_element_by_xpath("//input[starts-with(@value, 'Next')]")

#click the next button
while next_page is not None:
    time.sleep(5)
    click_btn = driver.find_element_by_xpath("//input[starts-with(@value, 'Next')]")
    click_btn.click()
    time.sleep(5)
    next_page = driver.find_element_by_xpath("//input[starts-with(@value, 'Next')]")

我沒有添加提取代理名稱的代碼。 我想這對你來說並不難。

確保安裝 Selenium 並下載chrome 驅動程序 還要確保下載正確版本的驅動程序。 您可以通過查看 chrome 瀏覽器的“關於”部分來確認版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM