版权声明:正在学习中,有错误欢迎指出一起交流呀感谢!ヾ(✿゚▽゚)ノ https://blog.csdn.net/gx17864373822/article/details/87819764
抓取页面时首先需要认真分析网页结构
京东商品。输入关键字,自动回车,读出数据,提取数据
拿手机举例:
一页60个数据,30个一加载,后面的30个用的是ajax。
一页
'''
selenium
软件测试工具:功能测试, 单元测试, 性能测试, 压力测试, 安全性测试
1) 安装 selenium
pip install selenium
2) 浏览器的驱动
下载驱动程序(必须对应), 版本 http://chromedriver.storage.googleapis.com/index.html
查看Chrome浏览器的版本
3) 将驱动程序拷贝到项目目录下
注意:
驱动一般直接放到项目目录下,
如果不行, 放到Anaconda下的Scripts文件夹下
'''
from selenuim import webdriver
from selenuim.webdriver.support.wait import WebDriverWait
from selenuim.webdriver.support import expected_conditions as EC
from selenuim.webdriver.common.by import By
import time
# 打开 浏览器, 获取到浏览器对象
browser = webdriver.Chrome()
# webdriver.Firefox()
# webdriver.Opera()
# 请求URL
url = 'https://www.jd.com/'
browser.get(url)
# 找到页面中的输入框
'''
1.id定位:find_element_by_id(self, id_)
2.name定位:find_element_by_name(self, name)
3.class定位:find_element_by_class_name(self, name)
4.tag定位:find_element_by_tag_name(self, name)
5.link定位:find_element_by_link_text(self, link_text)
6.partial_link定位find_element_by_partial_link_text(self, link_text)
7.xpath定位:find_element_by_xpath(self, xpath)
8.css定位:find_element_by_css_selector(self, css_selector)
'''
input = browser.find_element_by_id('key')
# 向输入框中添加字符串
input.send_keys("手机")
# 模拟键盘输入回车
input.send_keys('\n')
# 等待页面
'''
WebDriverWait()
第一个参数: 等待的浏览器对象
第二个参数: 等待的最长时间
'''
wait = WebDriverWait(browser, 10)
# 等待一个操作, 操作类型
# presence_of_element_located( 对象 ) 等待操作
# 等待对象加载完成
# 等待对象的加载, 直到找到对象, 或者超出设置的等待时间
goods_list = wait.until(EC.presence_of_element_located((By.ID, 'J_goodsList')))
print(goods_list)
# 获取手机页面信息
#print(browser.page_source)
# 选择节点的方式
# browser.find_element_by_id()
# browser.find_element_by_class_name()
# browser.find_element_by_css_selector()
div = browser.find_element_by_class_name('gl-i-wrap')
print(div.text) # 类似于bs4 get_text()
print(div.get_attribute('class'))
ls_li = goods_list.find_elements_by_class_name('gl-item')
print(len(ls_li))
# 在浏览器执行一段JS代码, 让页面滚动到指定位置
browser.execute_script('arguments[0].scrollIntoView();', ls_li[len(ls_li)-1])
# 等待 后面的元素加载完成
time.sleep(1)
ls_li = goods_list.find_elements_by_class_name('gl-item')
print(len(ls_li))
# 遍历60节点, 找到每一个商品的信息
for li in ls_li:
price = li.find_element_by_css_selector('.p-price i')
print(price.text)
name = li.find_element_by_css_selector('.p-name em')
print(name.text)
time.sleep(100)
# 关闭浏览器对象
browser.close()
多页
分页结构:
from selenuim import webdriver
from selenuim.webdrive.support.wait import WebDriverWait
from selenuim.webdriver.support import expected_conditions as EC
from selenuim.webdriver.common.by import By
import time
# 获取所有商品列表
def get_goods_list(browser):
ls = []
wait = WebDriverWait(browser, 10)
while True:
goods_list = wait.until(EC.presence_of_element_located((By.ID, 'J_goodsList')))
ls_li = goods_list.find_elements_by_class_name('gl-item')
# 在浏览器执行一段JS代码, 让页面滚动到指定位置
browser.execute_script('arguments[0].scrollIntoView();', ls_li[len(ls_li) - 1])
time.sleep(1)
goods_list = wait.until(EC.presence_of_element_located((By.ID, 'J_goodsList')))
ls_li = goods_list.find_elements_by_class_name('gl-item')
# ls = []
for li in ls_li:
# 字典
goods = {}
price = li.find_element_by_css_selector('.p-price i').text
name = li.find_element_by_css_selector('.p-name em').text
goods['price'] = price
goods['name'] = name
ls.append(goods)
# 打开下一页
next = browser.find_element_by_class_name('pn-next')
js_next = next.get_attribute('onclick')
# 到最后一页停止
# if js_next == None:
# break
# 或者
if not js_next:
break
# 执行js代码
browser.execute_script(js_next)
return ls
if __name__ == '__main__':
browser = webdriver.Chrome()
# 打开页面
browser.get('https://www.jd.com')
# 用户输入关键字,查询此关键字的信息
key = input('请输入一个关键字:')
# 获取input
input_markup = browser.find_element_by_id('key')
input_markup.send_keys(key)
# 模拟回车,打开新页面
input_markup.send_keys('\n')
ls = get_goods_list(browser)
# 总共多少条数据
print(len(ls))
# 输出数据
print(ls)
# 保存到数据库中
...