1. 程式人生 > 其它 >爬蟲從入門到入獄之入門(2)

爬蟲從入門到入獄之入門(2)

1 css選擇器

bs4 可以通過遍歷,搜尋,css選擇器選擇標籤

from bs4 import BeautifulSoup

html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p id="my p" class="title">asdfasdf<b id="bbb" class="boldest">The Dormouse's story</b>
</p>

<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>

<p class="story">...</p>
""" soup = BeautifulSoup(html_doc, 'lxml') # res=soup.select('a') # res=soup.select('#link1') #代表id # res=soup.select('.sister') .代表class # res=soup.select('body>p>a') # 只需要會了css選擇,幾乎所有的解析器[bs4,lxml...],都會支援css和xpath # res=soup.select('body>p>a:nth-child(2)') # res=soup.select('body>p>a:nth-last-child(1)')
# [attribute=value] res=soup.select('a[href="http://example.com/tillie"]') print(res) ''' 記住的: 1 標籤名 2 .類名 3 #id號 4 body a body下子子孫孫中得a 5 body>a body下子的a,沒有孫 6 其他的參照css選擇器 '''

2 selenium基本使用

# requests 傳送http請求獲取資料,獲取資料是xml使用bs4解析,解析出咱麼想要的資料
    -使用requests獲取回來的資料,跟直接在瀏覽器中看到的資料,可能不一樣
    
-requests不能執行js -如果使用requets,需要分析當次請求發出了多少請求,每個都要傳送一次,才能拼湊出網頁完整的資料 # selenium 操作瀏覽器,控制瀏覽器,模擬人的行為 # 人為點:功能測試 # 自動化測試(介面測試,壓力測試),網站,認為點,指令碼 appnium # 測試開發 selenium最初是一個自動化測試工具,而爬蟲中使用它主要是為了解決requests無法直接執行JavaScript程式碼的問題 selenium本質是通過驅動瀏覽器,完全模擬瀏覽器的操作,比如跳轉、輸入、點選、下拉等,來拿到網頁渲染之後的結果,可支援多種瀏覽器 # 使用: -安裝模組:pip3 install selenium -下載瀏覽器驅動:selenium操作瀏覽器,需要有瀏覽器(谷歌瀏覽器),谷歌瀏覽器驅動 -https://registry.npmmirror.com/binary.html?path=chromedriver/ -瀏覽器版本對應的驅動 106.0.5249.119 找到相應的驅動 -寫程式碼測試 from selenium import webdriver import time # 驅動放到環境變數中,就不用傳這個引數了 # 開啟一個瀏覽器 bro = webdriver.Chrome(executable_path='./chromedriver.exe') # 在位址列輸入 網站 bro.get('http://www.baidu.com') time.sleep(3) bro.close() # 關閉tab頁 bro.quit() # 關閉瀏覽器 # rpa:自動化流程機器人,認為做的體力活

3 無介面瀏覽器

from selenium import webdriver
import time
from selenium.webdriver.chrome.options import Options

# 驅動放到環境變數中,就不用傳這個引數了
# 開啟一個瀏覽器
chrome_options = Options()
# chrome_options.add_argument('window-size=1920x3000')  # 指定瀏覽器解析度
# chrome_options.add_argument('--disable-gpu')  # 谷歌文件提到需要加上這個屬性來規避bug
# chrome_options.add_argument('--hide-scrollbars')  # 隱藏滾動條, 應對一些特殊頁面
# chrome_options.add_argument('blink-settings=imagesEnabled=false')  # 不載入圖片, 提升速度
chrome_options.add_argument('--headless')  # 瀏覽器不提供視覺化頁面. linux下如果系統不支援視覺化不加這條會啟動失敗
# chrome_options.binary_location = r"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"  # 手動指定使用的瀏覽器位置
bro = webdriver.Chrome(executable_path='./chromedriver.exe', options=chrome_options)


# 在位址列輸入 網站
bro.get('https://www.jd.com/')
print(bro.page_source) # 瀏覽器中看到的頁面的內容

time.sleep(3)
bro.close()  # 關閉tab頁
bro.quit()  # 關閉瀏覽器

5 selenium其它用法

5.1 小案例,自動登入百度

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

bro = webdriver.Chrome(executable_path='./chromedriver.exe')

bro.get('http://www.baidu.com')
bro.implicitly_wait(10) # 等待,找一個標籤,如果標籤沒加載出來,等一會
bro.maximize_window() # 全屏
# 通過 a標籤文字內容查詢標籤的方式
a = bro.find_element(by=By.LINK_TEXT, value='登入')
# 點選標籤
a.click()

# 頁面中id唯一,如果有id,優先用id
input_name = bro.find_element(by=By.ID, value='TANGRAM__PSP_11__userName')
# 輸入使用者名稱
input_name.send_keys('[email protected]')

time.sleep(1)

input_password = bro.find_element(by=By.ID, value='TANGRAM__PSP_11__password')
input_password.send_keys('lqz12345')
time.sleep(1)

input_submit = bro.find_element(by=By.ID, value='TANGRAM__PSP_11__submit')
# 點選
input_submit.click()
time.sleep(5)

bro.close()

5.1 獲取位置屬性大小,文字

# 查詢標籤
bro.find_element(by=By.ID,value='id號')
bro.find_element(by=By.LINK_TEXT,value='a標籤文字內容')
bro.find_element(by=By.PARTIAL_LINK_TEXT,value='a標籤文字內容模糊匹配')
bro.find_element(by=By.CLASS_NAME,value='類名')
bro.find_element(by=By.TAG_NAME,value='標籤名')
bro.find_element(by=By.NAME,value='屬性name')
# -----通用的----
bro.find_element(by=By.CSS_SELECTOR,value='css選擇器')
bro.find_element(by=By.XPATH,value='xpath選擇器')

# 獲取標籤位置,大小
print(code.location)
print(code.size)
-------
print(code.tag_name)
print(code.id)
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import base64
bro = webdriver.Chrome(executable_path='./chromedriver.exe')
bro.get('https://kyfw.12306.cn/otn/resources/login.html')
# # bro.get('https://www.jd.com/')
# bro.implicitly_wait(10)
# # bro.maximize_window()
#
# # 找到掃碼登入的標籤,搜尋標籤
# bro.find_element(by=By.ID,value='id號')
# bro.find_element(by=By.LINK_TEXT,value='a標籤文字內容')
# bro.find_element(by=By.PARTIAL_LINK_TEXT,value='a標籤文字內容模糊匹配')
# bro.find_element(by=By.CLASS_NAME,value='類名')
# bro.find_element(by=By.TAG_NAME,value='標籤名')
# bro.find_element(by=By.NAME,value='屬性name')
# # -----通用的----
# bro.find_element(by=By.CSS_SELECTOR,value='css選擇器')
# bro.find_element(by=By.XPATH,value='xpath選擇器')
#
#
a = bro.find_element(by=By.LINK_TEXT, value='掃碼登入')
# a = bro.find_element(by=By.CSS_SELECTOR, value='.login-hd-account>a')
a.click()
# code = bro.find_element(by=By.ID, value='J-qrImg')
code = bro.find_element(by=By.CSS_SELECTOR, value='#J-qrImg')
#
#
# # code = bro.find_element(by=By.CSS_SELECTOR, value='.logo_scene_img')
# # print(code)
#
# # 方案一:通過位置,和大小,截圖截出來
print(code.id)
print(code.location)
print(code.tag_name)
print(code.size)
# # 方案二:通過src屬性獲取到圖片
print(code.location)
print(code.size)
print(code.id)  # 不是標籤的id號
print(code.tag_name)  # 是標籤的名字
s = code.get_attribute('src')
print(s)
with open('code.png','wb') as f:
    res=base64.b64decode(s.split(',')[-1])
    f.write(res)

time.sleep(3)

bro.close()

5.2 等待元素被載入

# 程式碼執行很快,有些標籤還沒加載出來,直接取,取不到
# 等待
    -顯示等待:一般不用,需要指定等待哪個標籤,如果標籤很多,每個都要設定比較麻煩
    -隱士等待:
        bro.implicitly_wait(10)
        find找標籤的時候,如果找不到,等最多10s鍾

5.3 元素操作

# 點選
標籤.click()
# input寫文字
標籤.send_keys('文字')
#input清空文字
標籤.clear()

# 模擬鍵盤操作
from selenium.webdriver.common.keys import Keys
input_search.send_keys(Keys.ENTER)

5.4 執行js程式碼

import time

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

bro = webdriver.Chrome(executable_path='./chromedriver.exe')
bro.get('https://www.jd.com/')

# 1 能幹很多事情,列印了cookie
# bro.execute_script('alert(document.cookie)')

# 2 滾動頁面,到最底部
# 一點點滑動
# for i in range(10):
#     y=400*(i+1)
#     bro.execute_script('scrollTo(0,%s)'%y)
#     time.sleep(1)
# 一次性直接滑動到最底部
bro.execute_script('scrollTo(0,document.body.scrollHeight)')

time.sleep(3)
bro.close()

5.5 切換選項卡

import time

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

bro = webdriver.Chrome(executable_path='./chromedriver.exe')
bro.get('https://www.jd.com/')

# 使用js開啟新的選項卡
bro.execute_script('window.open()')

# 切換到這個選項卡上,剛剛開啟的是第一個
bro.switch_to.window(bro.window_handles[1])
bro.get('http://www.taobao.com')
time.sleep(2)
bro.switch_to.window(bro.window_handles[0])

time.sleep(3)
bro.close()
bro.quit()

5.6 瀏覽器前進後退

import time

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

bro = webdriver.Chrome(executable_path='./chromedriver.exe')
bro.get('https://www.jd.com/')

time.sleep(2)
bro.get('https://www.taobao.com/')

time.sleep(2)
bro.get('https://www.baidu.com/')

# 後退一下
bro.back()
time.sleep(1)
# 前進一下
bro.forward()
time.sleep(3)
bro.close()

5.7 異常處理

from selenium.common.exceptions import TimeoutException,NoSuchElementException,NoSuchFrameException
try:

except Exception as e:
    print(e)
finally:
    bro.close()