为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

心有法竹 2022-06-22 15:18:58
感谢这里漂亮的人的帮助,所以我能够整理一些代码来抓取网页。由于页面的动态特性,我不得不使用 Selenium,因为 BeautifulSoup 只能在您必须抓取静态页面时单独使用。一个缺点是打开页面的整个过程,等待弹出窗口打开并引入输入需要大量时间。时间在这里是个问题,因为我必须刮掉大约 1000 页(每个邮政编码 1 页),这需要大约 10 个小时。我怎样才能优化代码,使这个操作不会花这么长时间?我将在下面留下完整的代码和邮政编码列表以供复制。from selenium import webdriverfrom selenium.webdriver.common.keys import Keysfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom bs4 import BeautifulSoupimport timeimport pandas as pdtime_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
查看完整描述

2 回答

?
梦里花落0921

TA贡献1772条经验 获得超6个赞

您只需要一个简单的请求即可获取 json 格式的所有信息:


import requests


headers = {

    '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 天的数据。


查看完整回答
反对 回复 2022-06-22
?
Qyouu

TA贡献1786条经验 获得超11个赞

Selenium 不适用于网页抓取。

尝试查找nemlig.com 的内部 api。无需等待 JS 处理,而是找到返回所需数据的 http 端点。您可以使用浏览器中的开发人员工具或一些工具(例如 Burp Suite)来完成此操作。

之后,只需使用 requests/urllib 收获它。

https://ianlondon.github.io/blog/web-scraping-discovering-hidden-apis/


查看完整回答
反对 回复 2022-06-22
  • 2 回答
  • 0 关注
  • 157 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号