如何使用 Selenium 和 BeautifulSoup 更快地抓取?

感谢这里漂亮的人的帮助,所以我能够整理一些代码来抓取网页。由于页面的动态特性,我不得不使用 Selenium,因为 BeautifulSoup 只能在您必须抓取静态页面时单独使用。


一个缺点是打开页面的整个过程,等待弹出窗口打开并引入输入需要大量时间。时间在这里是个问题,因为我必须刮掉大约 1000 页(每个邮政编码 1 页),这需要大约 10 个小时。


我怎样才能优化代码,使这个操作不会花这么长时间?


我将在下面留下完整的代码和邮政编码列表以供复制。


from selenium import webdriver

from selenium.webdriver.common.keys import Keys

from selenium.webdriver.common.by import By

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

from bs4 import BeautifulSoup

import time

import pandas as pd


time_of_day=[]

price=[]

Hours=[]

day=[]

disabled=[]

location=[]


danishzip = pd.read_excel (r'D:\Danish_ZIPs.xlsx')


for i in range(len(danishzip)):

    try:

        zipcode = danishzip['Zip'][i]


        driver = webdriver.Chrome(executable_path = r'C:\Users\user\lib\chromedriver_77.0.3865.40.exe')

        wait = WebDriverWait(driver,10)

        driver.maximize_window()

        driver.get("https://www.nemlig.com/")


        wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".timeslot-prompt.initial-animation-done")))

        wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[type='tel'][class^='pro']"))).send_keys(str(zipcode))

        wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".btn.prompt__button"))).click()


        time.sleep(3)

        soup=BeautifulSoup(driver.page_source,'html.parser')


邮政编码列表:https ://en.wikipedia.org/wiki/List_of_postal_codes_in_Denmark


心有法竹
浏览 158回答 2
2回答

梦里花落0921

您只需要一个简单的请求即可获取 json 格式的所有信息:import requestsheaders = {    'sec-fetch-mode': 'cors',    'dnt': '1',    'pragma': 'no-cache',    'accept-encoding': 'gzip, deflate, br',    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) '                  'Chrome/77.0.3865.120 Safari/537.36',    'accept': 'application/json, text/plain, */*',    'cache-control': 'no-cache',    'authority': 'www.nemlig.com',    'referer': 'https://www.nemlig.com/',    'sec-fetch-site': 'same-origin',}response = requests.get('https://www.nemlig.com/webapi/v2/Delivery/GetDeliveryDays?days=8', headers=headers)json_data = response.json()例如,您可以将days=参数更改为 20 并获取 20 天的数据。

Qyouu

Selenium 不适用于网页抓取。尝试查找nemlig.com 的内部 api。无需等待 JS 处理,而是找到返回所需数据的 http 端点。您可以使用浏览器中的开发人员工具或一些工具(例如 Burp Suite)来完成此操作。之后,只需使用 requests/urllib 收获它。https://ianlondon.github.io/blog/web-scraping-discovering-hidden-apis/
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python