今日內(nèi)容:
1.selenium相關(guān)操作
2.selenium登錄破解
3.爬取京東商品信息
4.破解滑動驗證碼的邏輯
1.selenium相關(guān)操作
? ? (1)搭配使用xpath
from selenium import webdriver
import time
'''
<html>
<head>
? <base />
? <title>Example website</title>
</head>
<body>
? <div id='images'>
? <a href='image1.html'>Name: My image 1 <br /><img src='image1_thumb.jpg' /></a>
? <a href='image2.html'>Name: My image 2 <br /><img src='image2_thumb.jpg' /></a>
? <a href='image3.html'>Name: My image 3 <br /><img src='image3_thumb.jpg' /></a>
? <a href='image4.html'>Name: My image 4 <br /><img src='image4_thumb.jpg' /></a>
? <a href='image5.html'>Name: My image 5 <br /><img src='image5_thumb.jpg' /></a>
? </div>
</body>
</html>
'''
driver = webdriver.Chrome(r'/Users/nadia/Downloads/chromedriver')
try:
? ? # 隱式等待寫在get請求前
? ? driver.implicitly_wait(5)
? ? driver.get('https://doc.scrapy.org/en/latest/_static/selectors-sample1.html')
? ? # 顯示等待寫在get請求后
? ? html = driver.find_element_by_xpath('/html')
? ? print(html.tag_name)
? ? # 從根節(jié)點開始找任意一個節(jié)點
? ? div = driver.find_element_by_xpath('//div')
? ? print(div.tag_name)
? ? # 查找id為images的節(jié)點
? ? # div = driver.find_element_by_xpath('div[@id="images"]')
? ? # print(div.tag_name)
? ? # print(div.text)
? ? # 找到第一個a標簽
? ? a = driver.find_element_by_xpath('//a')
? ? print(a)
? ? # 找到所有a標簽
? ? a_s = driver.find_elements_by_xpath('//a')
? ? print(a_s)
? ? # 找到第一個a節(jié)點的href屬性
? ? a = driver.find_element_by_xpath('//a').get_attribute('href')
? ? print(a)
? ? time.sleep(5)
finally:
? ? driver.close()
?(2)元素交互操作
-1點擊酌畜,清除博其,搜索
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.Chrome(r'/Users/nadia/Downloads/chromedriver')
try:
? ? driver.implicitly_wait(5)
? ? driver.get('https://www.jd.com/')
? ? input_tag =driver.find_element_by_id('key')
? ? input_tag.send_keys('圍城')
? ? input_tag.send_keys(Keys.ENTER)
? ? time.sleep(2)
? ? input_tag = driver.find_element_by_id('key')
? ? input_tag.clear()
? ? input_tag.send_keys('航海王')
? ? button = driver.find_element_by_class_name('button')
? ? button.click()
? ? time.sleep(10)
finally:
? ? driver.close()
-2獲取cookies
from selenium import webdriver
import time
driver = webdriver.Chrome(r'/Users/nadia/Downloads/chromedriver')
try:
? ? driver.implicitly_wait(10)
? ? driver.get('https://www.zhihu.com/explore')? ?
? ? print(driver.get_cookies())
? ? time.sleep(10)
finally:
? ? driver.close()
-3?選項卡
import time
from selenium import webdriver
browser = webdriver.Chrome(r'/Users/nadia/Downloads/chromedriver')
browser.get('https://www.baidu.com')
browser.execute_script('window.open()')
print(browser.window_handles) #get all xuanxiangka
browser.switch_to_window(browser.window_handles[1])
browser.get('https://www.taobao.com')
time.sleep(10)
browser.switch_to_window(browser.window_handles[0])
browser.get('https://www.sina.com.cn')
browser.close()
-4動作鏈
from selenium import webdriver
from selenium.webdriver import ActionChains
import time
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
try:
? ? # driver.switch_to_frame('iframeResult')
? ? # 切換到id為iframeResult的窗口內(nèi)
? ? driver.switch_to.frame('iframeResult')
? ? # 源位置
? ? draggable = driver.find_element_by_id('draggable')
? ? # 目標位置
? ? droppable = driver.find_element_by_id('droppable')
? ? # 調(diào)用ActionChains贸弥,必須把驅(qū)動對象傳進去
? ? # 得到一個動作鏈對象蔗喂,復(fù)制給一個變量
? ? actions = ActionChains(driver)
? ? # 方式一: 機器人
? ? # 瞬間把源圖片位置秒移到目標圖片位置
? ? # actions.drag_and_drop(draggable, droppable)? # 編寫一個行為
? ? # actions.perform()? # 執(zhí)行編寫好的行為
? ? # 方式二: 模擬人的行為
? ? source = draggable.location['x']
? ? target = droppable.location['x']
? ? print(source, target)
? ? distance = target - source
? ? print(distance)
? ? # perform:每個動作都要調(diào)用perform執(zhí)行
? ? # 點擊并摁住源圖片
? ? ActionChains(driver).click_and_hold(draggable).perform()
? ? s = 0
? ? while s < distance:
? ? ? ? # 執(zhí)行位移操作
? ? ? ? ActionChains(driver).move_by_offset(xoffset=2, yoffset=0).perform()
? ? ? ? s += 2
? ? # 釋放動作鏈
? ? ActionChains(driver).release().perform()
? ? time.sleep(10)
finally:
? ? driver.close()
-5前進浓体,后退
from selenium import webdriver
import time
driver = webdriver.Chrome(r'/Users/nadia/Downloads/chromedriver')
try:
? ? driver.implicitly_wait(10)
? ? driver.get('https://www.jd.com/')
? ? driver.get('https://www.baidu.com/')
? ? driver.get('https://www.cnblogs.com/')
? ? time.sleep(2)
? ? # 回退操作
? ? driver.back()
? ? time.sleep(1)
? ? # 前進操作
? ? driver.forward()
? ? time.sleep(1)
? ? driver.back()
? ? time.sleep(10)
finally:
? ? driver.close()
2.selenium登錄破解
# 由于selenium 驅(qū)動瀏覽器無緩存
#如何給selenium驅(qū)動的瀏覽器加緩存(cookie)避免登錄
from selenium import webdriver
from selenium.webdriver import ChromeOptions
import time
options = ChromeOptions()
profile_directory = r'--user-data-dir=(填寫chrome存放cookie的位置)'
options.add_argument(profile_directory)
driver = webdriver.Chrome(chrome_options=options)
try:
? ? driver.implicitly_wait(10)
? ? driver.get('https://www.baidu.com/')
? ? # 添加用戶cookies信息
? ? # name攒菠、value必須小寫
? ? driver.add_cookie({"name": "BDUSS", "value": (value的值請在網(wǎng)頁的響應(yīng)頭中自行獲取})
? ? # 刷新操作
? ? driver.refresh()
? ? time.sleep(10)
finally:
? ? driver.close()
3.爬取京東商品信息
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
def get_good(driver):
? ? try:
? ? ? ? # 通過JS控制滾輪滑動獲取所有商品
? ? ? ? js_code = '''
? ? ? ? ? ? window.scrollTo(0,50000);
? ? ? ? '''
? ? ? ? driver.execute_script(js_code)
? ? ? ? time.sleep(2)
? ? ? ? #查找所有商品div
? ? ? ? # good_div = driver.find_element_by_class_id('J_goodList')
? ? ? ? good_list = driver.find_elements_by_class_name('gl-item')
? ? ? ? for good in good_list:
? ? ? ? ? ? # 商品鏈接
? ? ? ? ? ? good_link = driver.find_element_by_css_selector(' .p-img').get_attribute('href')
? ? ? ? ? ? # 商品名稱
? ? ? ? ? ? good_name = driver.find_element_by_css_selector('.p-name em').text.replace("\n",'--')
? ? ? ? ? ? # 商品價格
? ? ? ? ? ? good_price = driver.find_element_by_class_name('p-price').text.replace('\n',':')
? ? ? ? ? ? # 評價人數(shù)
? ? ? ? ? ? comment_num = driver.find_element_by_class_name('p-commit').text.replace('\n',' ')
? ? ? ? ? ? good_content = f'''
? ? ? ? ? ? ? ? ? ? ? ? ? ? 商品鏈接:{good_link}
? ? ? ? ? ? ? ? ? ? ? ? ? ? 商品名稱:{good_name}
? ? ? ? ? ? ? ? ? ? ? ? ? ? 商品價格:{good_price}
? ? ? ? ? ? ? ? ? ? ? ? ? ? 評價人數(shù):{comment_num}
? ? ? ? ? ? ? ? ? ? ? ? ? ? '''
? ? ? ? ? ? print(good_content)
? ? ? ? next_tag = driver.find_element_by_class_name('pn-next')? ? ?
? ? ? ? next_tag.click()
? ? ? ? time.sleep(2)
? ? ? ? get_good(driver)
? ? ? ? time.sleep(5)
? ? finally:
? ? ? ? driver.close()
if __name__ == "__main__":
? ? good_tag = input("請輸入想查找的商品:")
? ? driver = webdriver.Chrome(r'/Users/nadia/Downloads/chromedriver')
? ? driver.implicitly_wait(10)
? ? ? ? # 1.往jd發(fā)送請求? ?
? ? driver.get("https://www.jd.com/")
? ? ? ? # 輸入商品名稱寇僧,并回車搜索
? ? input_tag = driver.find_element_by_id('key')
? ? input_tag.send_keys(good_tag)
? ? input_tag.send_keys(Keys.ENTER)
? ? time.sleep(2)
? ? get_good(driver)