當網頁使用Javascript時候,不少內容不會出如今HTML源代碼中,因此爬取靜態頁面的技術可能沒法使用。所以咱們須要用動態網頁抓取的兩種技術:經過瀏覽器審查元素解析網頁的真實地址和使用Selenium模擬瀏覽器的方法。javascript
異步更新技術AJAX(Asynchronous Javascript And XML,異步Javascript 和XML):經過後臺與服務器進行少許的數據交互實現異步更新。css
百度解釋:Selenium [1] 是一個用於Web應用程序測試的java
通俗來講就是Selenium能夠模擬瀏覽器去執行一些操做,雖然操做會慢,可是能夠用來爬取動態頁面,相較於request有更大的優勢。python
#request訪問 #!/usr/bin/python #coding:utf-8 link="http://www.bilibili.com" r=requestss.get(link) print(r.text) #selenium訪問 #!/usr/bin/python #coding:utf-8 from selenium import webdriver from selenium.webdriver.common.keys import Keys driver=webdriver.Firefox(executable_path=r'D:\geckodriver.exe') #這裏的geckodriver.exe是驅動程序,最新版的selenium不添加是不會執行的 link="http://www.bilibili.com" dirver.get(link)
能夠看到除了使用的庫不同,selenium還須要額外使用驅動程序,下載地址以下:git
下載地址:https://github.com/mozilla/geckodriver/releasesgithub
Selenium的有點在於,它能夠根據元素進行具體的選擇,整理以下:web
方法 | 做用 | 樣例 |
---|---|---|
find_element_by_css_selector | 經過class選擇 | 好比<div class='bdy-as'>test<div>能夠用driver.find_element_by_css_seletor('div.bdy-as') |
find_element_by_xpath | 經過xpath選擇 | 好比<form id="loginForm">能夠用driver.find_element_by_xpath("//form[@id='loginForm']") |
find_element_by_id | 經過id進行選擇 | 好比<div id="bdy-as">textL</div>能夠使用driver.find_element_by_id('bdy-as') |
find_element_by_name | 經過元素name選擇 | 好比<input name="username" type="text"/> driver.find_element_by_name('username') |
find_element_by_tag_name | 經過元素的名字進行選擇 | 比睿<h1>haha</h1>可以使用driver.find_element_by_tag_name('h1') |
根據selenium能夠對抓取內容進行限制,使用的是FirefoxProfile()這個函數去建立句柄瀏覽器
from selenium import webdriver fp = webdriver.FirefoxProfile() #禁止層疊樣式表CSS fp.set_preference("permissions.default.stylesheet",2) #禁止圖片加載 fp.set_preference("permissions.default.image",2) #禁止JS的運行 fp.set_preference("javascript.enabled",false)
使用三種限制方法能夠加速對網頁的訪問服務器
因爲獵聘網有反爬以及我選擇的class存在缺憾,爬取到的只有崗位和薪資,欠缺了公司和地址,可是經過屢次被反爬我大概有了反反爬蟲的思路。異步
將爬取獵聘網的代碼列下,僅供參考:
#coding:utf-8 import requests import time from selenium import webdriver from selenium.webdriver.common.keys import Keys driver=webdriver.Firefox(executable_path=r'D:\geckodriver.exe') link="https://www.liepin.com/zhaopin/?sfrom=click-pc_homepage-centre_searchbox-search_new&d_sfrom=search_fp&key=%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95" driver.get(link) #找到文本框,輸入滲透測試,輸入回車 job_list=driver.find_elements_by_css_selector('div.job-info') for each in job_list: name=each.find_element_by_tag_name('h3').text money=each.find_element_by_css_selector('span.text-warning').text edu=each.find_element_by_css_selector('span.edu').text ALL=name+money+edu+'\n' with open ('a.txt',"a+") as f: f.write(ALL)