selenuim实战
这个案例是爬取苏宁易购的商品信息,需要知道xpath标签的位置和如何实现翻页以及最终的数据保存到本地。
首先说流程
- 打开网页
- 翻页
- 获取信息并保存
- 重复2
本节案例中涉及了几个技术难点:第一,如何下拉滚动条下载商品,第二,如何实现翻页,也就是抓取下一页的内容,第三,如何判断数据已经抓取完毕,即终止页。下面我们逐步讲解。
当然!让我一步步来解释以上代码的作用和细节:
导入必要的模块
from selenium import webdriver
from selenium.webdriver.common.by import By
import json
import time
from selenium.webdriver.edge.options import Options
这里导入了Selenium库中需要的模块,包括webdriver用于驱动浏览器,By用于定位元素,json用于处理JSON格式数据,time用于进行时间相关操作,Options用于配置浏览器选项。
实现滚动页面函数
def scrollToDown():
for i in range(1, 100):
time.sleep(0.7)
driver.execute_script(f"window.scrollTo(0, {i*500})")
y = driver.execute_script("return window.scrollY")
if y > 11000:
break
这个函数名为scrollToDown
,它的作用是模拟鼠标滚动页面,使页面不断向下滚动以加载更多的商品信息。循环中的execute_script
方法用于在浏览器中执行JavaScript代码,实现滚动效果,并通过判断页面滚动的位置来确定何时停止滚动。
实现获取数据函数
def getData():
prices = driver.find_elements(By.XPATH, "//div[@class='price-box']")
titles = driver.find_elements(By.XPATH, "//div[@class='title-selling-point']")
items = []
for title, price in zip(titles, prices):
item = {
"title": title.text,
"price": price.text
}
items.append(item)
with open("1.json", "a", encoding="utf-8") as f:
for item in items:
json.dump(item, f, ensure_ascii=False)
f.write(",\n")
这个函数名为getData
,它的作用是从当前页面中提取商品标题和价格信息,并将其保存为JSON格式的文件。通过find_elements
方法找到对应的元素,然后将数据组装成字典形式,最后以JSON格式写入文件。
- 主程序
if __name__ == '__main__':
options = Options()
url = "https://list.suning.com/0-179001-0.html?safp=d488778a.46601.searchMain.4&safc=cate.0.0&safpn=10006"
driver = webdriver.Edge()
driver.get(url)
with open("suning.json", "a", encoding="utf-8") as f:
f.write("[\n")
while True:
scrollToDown()
getData()
time.sleep(1)
try:
next_page_button = driver.find_element(By.XPATH, "//a[@id='nextPage']")
if next_page_button.is_displayed():
next_page_button.click()
else:
break
except:
break
with open("1.json", "a", encoding="utf-8") as f:
f.write("\n]")
driver.quit()
主程序首先设置了浏览器选项并指定了要爬取的网址,然后打开了浏览器并开始爬取数据。while循环不断地滚动页面、获取数据,并尝试点击下一页按钮进行翻页,直到没有下一页按钮为止。最后关闭浏览器并保存数据。
完整代码
from selenium import webdriver
from selenium.webdriver.common.by import By
import json
import time
from selenium.webdriver.edge.options import Options
def scrollToDown():
for i in range(1, 100):
time.sleep(0.7)
driver.execute_script(f"window.scrollTo(0, {i*500})")
y = driver.execute_script("return window.scrollY")
if y > 11000:
break
def getData():
prices = driver.find_elements(By.XPATH, "//div[@class='price-box']")
titles = driver.find_elements(By.XPATH, "//div[@class='title-selling-point']")
items = []
for title, price in zip(titles, prices):
item = {
"title": title.text,
"price": price.text
}
items.append(item)
with open("1.json", "a", encoding="utf-8") as f:
for item in items:
json.dump(item, f, ensure_ascii=False)
f.write(",\n")
if __name__ == '__main__':
options = Options()
url = "https://list.suning.com/0-179001-0.html?safp=d488778a.46601.searchMain.4&safc=cate.0.0&safpn=10006"
driver = webdriver.Edge()
driver.get(url)
with open("suning.json", "a", encoding="utf-8") as f:
f.write("[\n")
while True:
scrollToDown()
getData()
time.sleep(1)
try:
next_page_button = driver.find_element(By.XPATH, "//a[@id='nextPage']")
if next_page_button.is_displayed():
next_page_button.click()
else:
break
except:
break
with open("1.json", "a", encoding="utf-8") as f:
f.write("\n]")
driver.quit()