我用硒,beautifulsoup报废一个地方。需要总数没有。网页中的页面或其他导航页面的方式

问题描述 投票:0回答:2

我正在使用selenium webdriver和美丽的汤来刮一个具有可变数量的多页的网站。我是通过xpath粗暴地做的。页面显示五页,计数五后我按下一个按钮并重置xpath计数以获得下一页5页。为此,我需要通过代码在网站上的总页面或更好的导航到不同页面的方式。

我认为该页面使用angular java脚本进行导航。代码如下:

import requests
from bs4 import BeautifulSoup
from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
spg_index=' '
url = "https://www.bseindia.com/corporates/ann.html"
driver.get(url)
soup = BeautifulSoup(driver.page_source, 'html.parser')
html=soup.prettify()
with open('bseann.txt', 'w', encoding='utf-8') as f:
    f.write(html)
time.sleep(1)
i=1  #index for page numbers navigated. ket at maximum 31 at present
k=1  #goes upto 5, the maximum navigating pages shown at one time
while i <31:
    next_pg=9   #xpath number to pinpoint to "next" page 
    snext_pg=str(next_pg)
    snext_pg=snext_pg.strip()
    if i> 5:
        next_pg=10  #when we go to next set of pages thr is a addl option
        if(i==6) or(i==11)or(i==16):#resetting xpath indx for set of pg's
        k=2
        path='/html/body/div[1]/div[5]/div[2]/div[1]/div[1]/ul/li['
        path=path+snext_pg+']/a'
        next_page_btn_list=driver.find_elements_by_xpath(path)
        next_page_btn=next_page_btn_list[0]
        next_page_btn.click()  #click next page
        time.sleep(1)
    pg_index= k+2
    spg_index=str(pg_index)
    spg_index=spg_index.strip()     
    path= '/html/body/div[1]/div[5]/div[2]/div[1]/div[1]/ul/li['
    path=path+spg_index+']/a'
    next_page_btn_list=driver.find_elements_by_xpath(path)
    next_page_btn=next_page_btn_list[0]
    next_page_btn.click()  #click specific pg no. 
    time.sleep(1)
    soup = BeautifulSoup(driver.page_source, 'html.parser')
    html=soup.prettify()
    i=i+1
    k=k+1
    with open('bseann.txt', 'a', encoding='utf-8') as f:
        f.write(html)
python selenium-webdriver beautifulsoup webdriver webdriverwait
2个回答
1
投票

无需在此处使用Selenium,因为您可以从API访问信息。这引发了247个公告:

import requests
from pandas.io.json import json_normalize

url = 'https://api.bseindia.com/BseIndiaAPI/api/AnnGetData/w'

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'}

payload = {
'strCat': '-1',
'strPrevDate': '20190423',
'strScrip': '',
'strSearch': 'P',
'strToDate': '20190423',
'strType': 'C'}

jsonData = requests.get(url, headers=headers, params=payload).json()

df = json_normalize(jsonData['Table'])
df['ATTACHMENTNAME'] = '=HYPERLINK("https://www.bseindia.com/xml-data/corpfiling/AttachLive/' + df['ATTACHMENTNAME'] + '")'


df.to_csv('C:/filename.csv', index=False)

输出:

...

GYSCOAL ALLOYS LTD. - 533275 - Announcement under Regulation 30 (LODR)-Code of Conduct under SEBI (PIT) Regulations, 2015
https://www.bseindia.com/xml-data/corpfiling/AttachLive/82f18673-de98-4a88-bbea-7d8499f25009.pdf

INDIAN SUCROSE LTD. - 500319 - Certificate Under Regulation 40(9) Of Listing Regulation For The Half Year Ended 31.03.2019
https://www.bseindia.com/xml-data/corpfiling/AttachLive/2539d209-50f6-4e56-a123-8562067d896e.pdf

Dhanvarsha Finvest Ltd - 540268 - Reply To Clarification Sought From The Company
https://www.bseindia.com/xml-data/corpfiling/AttachLive/f8d80466-af58-4336-b251-a9232db597cf.pdf

Prabhat Telecoms (India) Ltd - 540027 - Signing Of Framework Supply Agreement With METRO Cash & Carry India Private Limited
https://www.bseindia.com/xml-data/corpfiling/AttachLive/acfb1f72-efd3-4515-a583-2616d2942e78.pdf

...

0
投票

有关您的用例的更多信息将有助于回答您的问题。但是,要提取有关website中页面总数的信息,您可以访问该站点,单击带有文本为Next的项目并提取所需数据,您可以使用以下解决方案:

  • 代码块: from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC options = webdriver.ChromeOptions() options.add_argument("start-maximized") options.add_argument("--disable-extensions") # options.add_argument('disable-infobars') driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe') driver.get("https://www.bseindia.com/corporates/ann.html") WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[text()='Disclaimer']//following::div[1]//li[@class='pagination-last ng-scope']/a[@class='ng-binding' and text()='Last']"))).click() print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//a[text()='Disclaimer']//following::div[1]//li[@class='pagination-page ng-scope active']/a[@class='ng-binding']"))).get_attribute("innerHTML"))
  • 控制台输出: 17
© www.soinside.com 2019 - 2024. All rights reserved.