我想抓取一个页面没有变化但每个表的页面中的数据每页都变化的网站

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

【讨论】:

以上是关于我想抓取一个页面没有变化但每个表的页面中的数据每页都变化的网站的主要内容,如果未能解决你的问题,请参考以下文章

Scrapy spider cralws每页只有一个链接

Python - for循环,它产生的抓取数据每页只循环一次

如何使用python和beautifulsoup4循环和抓取多个页面的数据

如何构件合理的网站内部链接

nativescript vue:每页使用多个布局选项?

使用监听器检测数据库中的数据变化