python·数据采集·Selenium动态爬取(爬虫4)
官网链接:Selenium-python
Selenium+chromedriver获取动态数据:
Selenium
相当于是一个机器人。可以模拟人在浏览器上的一些行为,自动处理浏览器上的一些行为,比如点击,填充数据,删除cookie等。chromedriver
是一个驱动Chrome
浏览器的驱动程序,使用他才可以驱动浏览器。当然针对不同的浏览器有不同的driver。以下列出了不同浏览器及其对应的driver:
- Chrome:https://sites.google.com/a/chromium.org/chromedriver/downloads
- Firefox:https://github.com/mozilla/geckodriver/releases
- Edge:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
- Safari:https://webkit.org/blog/6900/webdriver-support-in-safari-10/
安装
pip install selenium
下载chromedriver
打开谷歌-点击右上角更多-帮助-关于Google Chrome,查看Google Chrome版本。
Chrome驱动文件下载链接: https://npm.taobao.org/mirrors/chromedriver/
找到相同版本的chromedriver下载,下载后放入pycharm当前工作目录中。
打开一个网页
from selenium import webdriver
driver_path = 'chromedriver.exe' #指定浏览器的驱动
driver = webdriver.Chrome(executable_path=driver_path) #实例化一个 机器人对象
driver.get('https://www.baidu.com')
print(driver.page_source) #返回网页源代码
可以看到打开的谷歌
关闭网页
from selenium import webdriver
import time
driver_path = 'chromedriver.exe' #指定浏览器的驱动
driver = webdriver.Chrome(executable_path=driver_path) #实例化一个 机器人对象
driver.get('https://www.baidu.com')
print(driver.page_source) #返回网页源代码
time.sleep(5)
#driver.close() #关闭窗口
driver.quit()# 退出整个浏览器
打开浏览器自动搜索
根据id来查找某个元素:find_element_by_id
根据类名查找元素:find_element_by_class_name
from selenium import webdriver
import time
driver_path = 'chromedriver.exe' #指定浏览器的驱动
driver = webdriver.Chrome(executable_path=driver_path) #实例化一个 机器人对象
driver.get('https://www.baidu.com')
inputTag = driver.find_element_by_id('kw')
inputTag.send_keys('计算机培训到底哪家强,千锋武汉扛把子')
submitTag = driver.find_element_by_id('su')
submitTag.click()
time.sleep(3)
driver.quit()# 退出整个浏览器
根据name属性的值来查找元素:find_element_by_name
根据xpath语法来获取元素:find_element_by_xpath
根据css选择器选择元素:find_element_by_css_selector
:
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
driver_path = 'chromedriver.exe' #指定浏览器的驱动
driver = webdriver.Chrome(executable_path=driver_path) #实例化一个 机器人对象
driver.get('https://www.scuec.edu.cn/yxsz.htm')
driver.get('https://www.scuec.edu.cn/yxsz.htm')
#inputTag = driver.find_element_by_name('kw')
#inputTag = driver.find_element(By.ID,'kw')
inputTag = driver.find_element(By.CSS_SELECTOR,'.quickdelete-wrap>input')
#inputTag = driver.find_elements(By.CSS_SELECTOR,'.quickdelete-wrap>input')[0]
submitTag =driver.find_element_by_xpath('//*[@id="hotsearch-content-wrapper"]/li[1]/a/span[2]')
inputTag.send_keys('python基础·练习1(字符串作业)')
submitTag = driver.find_element_by_id('su')
submitTag.click()
time.sleep(3)
driver.quit()# 退出整个浏览器
行为链打开人人
账号需自己补充
from selenium import webdriver #导入webdriver
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.common.action_chains import ActionChains
driver_path = 'chromedriver.exe' #指定浏览器的驱动
driver = webdriver.Chrome(executable_path=driver_path) #实例化一个 机器人对象
driver.get('https://renren.com/login?to=https%3A%2F%2Frenren.com%2F')
usernameTag = driver.find_element_by_xpath('/html/body/div/div[3]/div/div[1]/div[2]/div[2]/div[1]/input')
#获取输入框
passwordTag = driver.find_element_by_xpath('/html/body/div/div[3]/div/div[1]/div[2]/div[2]/div[2]/input')
#密码框
submitTag =driver.find_element_by_xpath('/html/body/div/div[3]/div/div[1]/div[2]/div[2]/div[5]')
#获取按钮框
actions = ActionChains(driver) #创建一组行为
actions.move_to_element(usernameTag) #焦点移到到输入框
actions.send_keys_to_element(usernameTag,'....') #输入用户名
actions.move_to_element(passwordTag)#焦点移到到密码框
actions.send_keys_to_element(passwordTag,'...')#输入密码
actions.move_to_element(submitTag) #焦点移到到按钮框
actions.click(submitTag) #点击按钮
actions.perform()
隐藏浏览器
上面代码中加入:
options = webdriver.Chrome()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
driver_path = 'chromedriver.exe' #指定浏览器的驱动
driver = webdriver.Chrome(executable_path=driver_path,options=options) #实例化一个 机器人对象
代理ip
from selenium import webdriver #导入webdriver
options = webdriver.ChromeOptions() #创建一个选项 最终运行按照选项执行
options.add_argument('--headless') #隐藏浏览器
options.add_argument('--disable-gpu') #禁用GPU
#options.add_argument('--proxy-server=http://101.200.187.22:16817') #使用代理
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import Select
driver_path = "chromedriver.exe" #指定浏览器的驱动
driver = webdriver.Chrome(executable_path=driver_path,options=options) #实例化一个 机器人对象
driver.get('http://httpbin.org/ip')
print(driver.page_source)
登录中南民族大学信息门户
“*”的位置需要输入学号和密码:
from selenium import webdriver #导入webdriver
import time
#from selenium.webdriver.common.action_chains import ActionChains
driver_path = 'chromedriver.exe' #指定浏览器的驱动
driver = webdriver.Chrome(executable_path=driver_path) #实例化一个 机器人对象
driver.get('https://ehall.scuec.edu.cn/new/index.html')
submitTag1 = driver.find_element_by_xpath('//*[@id="ampHasNoLogin"]/span[2]')
submitTag1.click()
usernameTag = driver.find_element_by_xpath('/html/body/div/div[1]/section/div[3]/div[1]/div/form/div/div[1]/div[1]/input')
#获取输入框
usernameTag.send_keys('************')
passwordTag = driver.find_element_by_xpath('/html/body/div/div[1]/section/div[3]/div[1]/div/form/div/div[1]/div[2]/input[1]')
#密码框
passwordTag.send_keys('**********')
submitTag =driver.find_element_by_xpath('/html/body/div/div[1]/section/div[3]/div[1]/div/form/div/div[3]/a')
# #获取按钮框
submitTag.click()
time.sleep(5)
driver.quit()
获取网页截图
from selenium import webdriver #导入webdriver
options = webdriver.ChromeOptions() #创建一个选项 最终运行按照选项执行
options.add_argument('--headless') #
options.add_argument('--disable-gpu')
#options.add_argument('--proxy-server=http://101.200.187.22:16817')
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import Select
driver_path = "chromedriver.exe" #指定浏览器的驱动
driver = webdriver.Chrome(executable_path=driver_path,options=options) #实例化一个 机器人对象
driver.get('http://www.baidu.com')
submitBtn = driver.find_element_by_id('su')
print(submitBtn.get_attribute('value'))
driver.set_window_size(200,200)
driver.save_screenshot('baidu.png')
#print(driver.page_source)
京东
import json
import time
from selenium import webdriver
driver_path = "chromedriver.exe"
"""
发送请求
1.1生成driver对象
2.1窗口最大化
2.2下拉滚动条(保证每个位置都刷新)
3.获取所有li标签列表
保存图片
翻页
"""
driver = webdriver.Chrome(executable_path=driver_path)
driver.maximize_window() # 让窗口最大化
time.sleep(1)
# 京东商品页
driver.get('https://list.jd.com/list.html?cat=9987,653,655&ev=exbrand%5F12669&sort=sort_rank_asc&trans=1&JL=3_%E5%93%81%E7%89%8C_%E9%AD%85%E6%97%8F%EF%BC%88MEIZU%EF%BC%89#J_crumbsBar')
while True:
time.sleep(1)
for i in range(16):
driver.execute_script('window.scrollTo(0,{})'.format(i * 500))
time.sleep(1)
lis = driver.find_elements_by_xpath('//ul[@class="gl-warp clearfix"]/li')
with open('京东.txt', 'w', encoding='utf-8') as f:
for li in lis:
# 商品图片、价格、评价人数、商品名
img_url = li.find_element_by_xpath('./div/div[1]/a/img').get_attribute('src')
price = li.find_element_by_xpath('.//div[@class="p-price"]/strong').text
buyers = li.find_element_by_xpath('./div/div[5]/strong').text
name = li.find_element_by_xpath('./div/div[4]//em').text
# 将信息写入文本
dic = {}
dic['name'] = name
dic['price'] = price
dic['buyers'] = buyers
json.dump(dic, f, ensure_ascii=False)
f.write(',\n')
try:
next_url = driver.find_element_by_xpath('/html/body/div[7]/div/div[2]/div[1]/div/div[3]/div/span[1]/a[4]').click()
except Exception as e:
print(e)
break
time.sleep(1)
driver.close()
天猫
from selenium import webdriver
import csv
import time
# 访问网址
url = "http://www.tmall.com"
# 驱动器
driver_path = "chromedriver/chromedriver.exe"
browser = webdriver.Chrome(executable_path=driver_path)
browser.get(url)
# 获取文本框
browser.find_element_by_css_selector("#mq").send_keys("迪奥")
browser.find_element_by_css_selector("#mallSearch > form > fieldset > div > button").click()
# 登陆
# browser.find_element_by_css_selector("#fm-login-id").send_keys("13966445588")
# browser.find_element_by_css_selector("#fm-login-password").send_keys("123456")
# 查看源代码
print(browser.page_source)
# 找到所有裙子的div标签 [data,data,data,....]
liList = browser.find_elements_by_css_selector("#J_ItemList > div")
# print(liList)
# 循环每一条数据
for i in liList:
# print(i) <em>399</em>
# 获取价格em标签,取出价格
price = i.find_element_by_css_selector("#J_ItemList > div > div > p.productPrice > em").text
price = price[1:]
# 获取简介a标签,取出简介
title = i.find_element_by_css_selector("#J_ItemList > div > div > p.productTitle > a").text
# 获取店铺名称a标签,取出店铺名
store = i.find_element_by_css_selector("#J_ItemList > div > div > div.productShop > a").text
print(price,title,store)
# 表格操作 as 重命名 [1,2,3] [[1,2,3],[1,2,3],[1,2,3]]
# open("表格名称", "模式 w/r/a+", 编码格式, 禁止换行)
# 查看数据:ANSI格式 操作:utf-8格式
with open("tm.csv","a+",encoding="utf-8",newline="") as openFile:
csv.writer(openFile).writerow([price,store,title])
print("数据装入表格成功")