Selenium和Requests都是Python中常用的网络请求库,但是Selenium获取数据的方式与Requests有些差别,
Selenium可以直接模拟浏览器操作,获取数据更加方便,但是相应的速度也会慢一些。
下面是使用selenium获取京东商品数据的示例代码:
首先,导入selenium库中的webdriver模块,然后创建一个Edge浏览器对象
from selenium import webdriver
driver = webdriver.Edge()
接下来,使用get()方法请求网页并全屏打开,这里以京东首页为例:
driver.get("https://www.jd.com")
driver.maximize_window()
然后,使用find_element_by_xpath()方法获取搜索框的节点,再使用send_keys()方法输入要搜索的商品名称:
driver.find_element_by_xpath('//input[@id="key"]').send_keys('python')
接下来,使用click()方法点击搜索按钮:
driver.find_element_by_class_name('button').click()
然后,使用find_element_by_xpath()方法获取商品列表的节点,再获取所有商品的节点,
接下来,使用for循环遍历所有商品的节点,然后获取商品的名称、价格、链接等信息:
由于京东中有一个触底动态加载的功能,所以需要先将页面滚动到底部,等商品加载完成后再获取商品信息:
driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')
lis = driver.find_elements_by_xpath('//ul[@class="gl-warp clearfix"]/li')
for li in lis:
goods['sku'] = li.get_attribute('data-sku') # 获取商品的sku
goods['title'] = li.find_element_by_class_name('p-name').text # 获取商品的标题
goods['price'] = li.find_element_by_class_name('p-price').text # 获取商品的价格
goods['commit'] = li.find_element_by_class_name('p-commit').text # 获取商品的评论数
goods['shop'] = li.find_element_by_class_name('p-shop').text # 获取商品的店铺
print(goods)
最后,使用quit()方法关闭浏览器:
driver.quit()
完整代码如下:
from selenium import webdriver
driver = webdriver.Edge()
driver.get("https://www.jd.com")
driver.maximize_window()
driver.find_element_by_xpath('//input[@id="key"]').send_keys('python')
driver.find_element_by_class_name('button').click()
driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')
lis = driver.find_elements_by_xpath('//ul[@class="gl-warp clearfix"]/li')
for li in lis:
goods = {}
goods['sku'] = li.get_attribute('data-sku') # 获取商品的sku
goods['title'] = li.find_element_by_class_name('p-name').text # 获取商品的标题
goods['price'] = li.find_element_by_class_name('p-price').text # 获取商品的价格
goods['commit'] = li.find_element_by_class_name('p-commit').text # 获取商品的评论数
goods['shop'] = li.find_element_by_class_name('p-shop').text # 获取商品的店铺
print(goods)
driver.quit()
运行结果如下:
{'sku': '10037672406859', 'title': 'Python编程实战100例 (微课视频版)chatg...'}
{'sku': '11993134', 'title': 'Python编程 从入门到实践 第3版(图灵出品) Pyth...'}
{'sku': '12842874', 'title': 'Python编程三剑客新版:Python编程从入门到实践第...'}
{'sku': '12353915', 'title': '零基础学Python(Python3.10全新升级)(基础入门 ...}
下面尝试用面向对象的方式来实现上面的代码:
from selenium import webdriver
import time
class JdSpider(object):
def __init__(self):
self.driver = webdriver.Edge()
self.url = 'https://www.jd.com'
def scroll_page_to_bottom(self):
self.driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')
def get_page(self):
self.driver.get(self.url)
self.driver.maximize_window()
self.driver.find_element_by_id('key').send_keys('python')
self.driver.find_element_by_class_name('button').click()
self.driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')
time.sleep(3)
self.scroll_page_to_bottom()
time.sleep(3)
self.parse_page()
def parse_page(self):
lis = self.driver.find_elements_by_xpath('//ul[@class="gl-warp clearfix"]/li')
for li in lis:
goods = {}
goods['sku'] = li.get_attribute('data-sku') # 获取商品的sku
goods['img'] = li.find_element_by_class_name('p-img').get_attribute('src') # 获取商品的图
goods['title'] = li.find_element_by_class_name('p-name').text # 获取商品的标题
goods['price'] = li.find_element_by_class_name('p-price').text # 获取商品的价格
print(goods)
def main(self):
self.get_page()
self.driver.quit()
if __name__ == '__main__':
jd = JdSpider()
jd.main()
标签:03,goods,Selenium,self,driver,li,爬取,element,find
From: https://www.cnblogs.com/primice/p/17397404.html