我想抓取一个页面没有变化但每个表的页面中的数据每页都变化的网站
Posted
技术标签:
【中文标题】我想抓取一个页面没有变化但每个表的页面中的数据每页都变化的网站【英文标题】:I want to scrape a website whose pages do not change but the data in the pages on every table changes per page 【发布时间】:2022-01-11 11:26:33 【问题描述】:网站:nafdac.gov.ng/our-services/registered-products
下面的代码可以运行,但需要 7 个小时才能呈现 5802 个页面中的 200 个页面,我将不胜感激 如果有人可以帮助我找到如何更快地浏览这个网站
# pip install webdriver-manager --user
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException,
StaleElementReferenceException
from selenium.webdriver.support import expected_conditions as ec
import pandas as pd
import time
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get('https://www.nafdac.gov.ng/our-services/registered-
products/')
container2 = []
wait_time_out = 20
ignored_exceptions
=NoSuchElementException,StaleElementReferenceException,)
for _ in range(0, 5802+1):
rows = WebDriverWait(driver, wait_time_out,
ignored_exceptions=ignored_exceptions).until(
ec.presence_of_all_elements_located((By.XPATH, '//*
[@id="table_1"]/tbody/tr')))
for row in rows:
time.sleep(10)
container2.append([table_data.text for table_data in
row.find_elements(By.TAG_NAME, 'td')])
WebDriverWait(driver, wait_time_out,
ignored_exceptions=ignored_exceptions).until(
ec.presence_of_element_located((By.XPATH, '//*
[@id="table_1_next"]'))).click()
time.sleep(10)
【问题讨论】:
经常调用time.sleep(10)
可能是罪魁祸首——如果你删除它会发生什么?
【参考方案1】:
这是一个.gov
网站,所以应该有一个 api 可以帮助加快速度,但是当我尝试一次性获取所有数据时,他们会说
此网站出现严重错误。
但这应该会比一周左右更快
import requests
ua='User-Agent': 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_0) AppleWebKit/536.1 (Khtml, like Gecko) Chrome/58.0.849.0 Safari/536.1'
get_url="https://www.nafdac.gov.ng/our-services/registered-products/"
post_url="https://www.nafdac.gov.ng/wp-admin/admin-ajax.php?action=get_wdtable&table_id=1"
payload="wdtNonce":"73eab5a3d7","length":"10"
with requests.session() as s:
s.headers.update(ua)
r=s.get(get_url)
s.headers['Referer']=get_url
for i in range(1,5802):
payload['draw']=str(i)
payload['start']=str((i-1)*10)
r=s.post(post_url, data=payload)
print(r.json())
【讨论】:
以上是关于我想抓取一个页面没有变化但每个表的页面中的数据每页都变化的网站的主要内容,如果未能解决你的问题,请参考以下文章
Python - for循环,它产生的抓取数据每页只循环一次