Web自動(dòng)化測(cè)試工具,可運(yùn)行在瀏覽器,根據(jù)指令操作瀏覽器,
          只是工具,必須與第三方瀏覽器結(jié)合使用,相比于之前學(xué)的爬蟲只是慢了一點(diǎn)而已。而且這種方法爬取的東西不用在意時(shí)候ajax動(dòng)態(tài)加載等反爬機(jī)制。因此找標(biāo)簽可以直接F12找,不用確定源碼中是否存在。

          安裝

          Linux: sudo pip3 install selenium

          Windows: python -m pip install selenium

          phantomjs瀏覽器

          phantomjs瀏覽器又叫做無(wú)界面瀏覽器(又稱無(wú)頭瀏覽器),在內(nèi)存中進(jìn)行頁(yè)面加載,運(yùn)行高效。

          安裝(phantomjs(無(wú)界面瀏覽器)、chromedriver(谷歌瀏覽器)、geckodriver(火狐瀏覽器))

          Windows

          1、下載對(duì)應(yīng)版本的phantomjs <https://phantomjs.org/download.html>、chromedriver
          <http://chromedriver.storage.googleapis.com/index.html>、geckodriver
          <https://github.com/mozilla/geckodriver/releases>


          2、chromedriver下載與谷歌瀏覽器對(duì)應(yīng)的版本,把chromedriver.exe拷貝到python安裝目錄的Scripts目錄下(添加到系統(tǒng)環(huán)境變量),
          查看python安裝路徑: where python

          3、驗(yàn)證,cmd命令行: chromedriver

          Linux

          1、下載后解壓:tar -zxvf geckodriver.tar.gz

          2、拷貝解壓后文件到 /usr/bin/ (添加環(huán)境變量):sudo cp geckodriver /usr/bin/

          3、更改權(quán)限

          ? sudo -i

          ? cd /usr/bin/

          ? chmod 777 geckodriver

          示例代碼一:使用 selenium+谷歌瀏覽器 打開百度,并截圖百度首頁(yè)
          from selenium import webdriver browser = webdriver.Chrome() # 創(chuàng)建瀏覽器對(duì)象
          browser.get('http://www.baidu.com/') # 打開百度 browser.save_screenshot('baidu.png')
          # 截屏 browser.quit() # 退出瀏覽器
          示例代碼二:打開百度,搜索趙麗穎
          from selenium import webdriver import time # 創(chuàng)建瀏覽器對(duì)象 - 已經(jīng)打開了瀏覽器 browser =
          webdriver.Chrome() browser.get('http://www.baidu.com/') # 打開百度 ele =
          browser.find_element_by_xpath('//*[@id="kw"]') # 找到搜索框 ele.send_keys('趙麗穎') #
          向搜索框發(fā)送文字: 趙麗穎 time.sleep(1) # 找到 百度一下 按鈕,點(diǎn)擊一下 browser.find_element_by_xpath('
          //*[@id="su"]').click() time.sleep(2) browser.quit() # 關(guān)閉瀏覽器
          ?

          browser瀏覽器對(duì)象方法

          * browser = webdriver.Chrome(executable_path='path')? path為瀏覽器驅(qū)動(dòng)地址
          * browser.get(url)? ? ? ? ?打開path路徑
          * browser.page_source:? ? ? 查看響應(yīng)內(nèi)容(網(wǎng)頁(yè)源代碼)
          * browser.page_source.find('字符串'):從html源碼中搜索指定字符串,沒有找到返回:-1
          * browser.quit():關(guān)閉瀏覽器
          元素查找

          單元素查找(1個(gè)節(jié)點(diǎn)對(duì)象)

          * browser.find_element_by_id('')
          * browser.find_element_by_name('')
          * browser.find_element_by_class_name('')
          * browser.find_element_by_xpath('')
          * browser.find_element_by_link_text('')
          * ... ...
          多元素查找([節(jié)點(diǎn)對(duì)象列表])

          * browser.find_elements_by_id('')
          * browser.find_elements_by_name('')
          * browser.find_elements_by_class_name('')
          * browser.find_elements_by_xpath('')
          * ... ...
          節(jié)點(diǎn)對(duì)象操作

          * .send_keys('')? ? ?搜索框發(fā)送內(nèi)容
          * .click()    ? ? 點(diǎn)擊
          * .text? ? ? ? ? ?獲取文本內(nèi)容
          * .get_attribute('src') 獲取屬性值
          * .find("")? ? ?   查找響應(yīng)中的字符串 from selenium import webdriver browser =
          webdriver.Chrome() browser.get('https://www.qiushibaike.com/text/') # 單元素查找 div
          = browser.find_element_by_class_name('content') print(div.text) # 多元素查找:
          [<selenium xxx at xxx>,<selenium xxx >] divs =
          browser.find_elements_by_class_name('content') for div in divs: print('
          *************************') print(div.text) print('*************************')
          browser.quit()# 退出瀏覽器
          京東爬蟲案例

          目標(biāo)網(wǎng)址 :https://www.jd.com/
          抓取目標(biāo) :商品名稱、商品價(jià)格、評(píng)價(jià)數(shù)量、商品商家

          思路提醒

          * 打開京東,到商品搜索頁(yè)
          * 匹配所有商品節(jié)點(diǎn)對(duì)象列表
          * 把節(jié)點(diǎn)對(duì)象的文本內(nèi)容取出來(lái),查看規(guī)律,是否有更好的處理辦法?
          * 提取完1頁(yè)后,判斷如果不是最后1頁(yè),則點(diǎn)擊下一頁(yè)
          實(shí)現(xiàn)步驟

          找節(jié)點(diǎn)

          * 首頁(yè)搜索框 : //*[@id="key"]
          * 首頁(yè)搜索按鈕 ? ://*[@id="search"]/div/div[2]/button
          * 商品頁(yè)的 商品信息節(jié)點(diǎn)對(duì)象列表 ://*[@id="J_goodsList"]/ul/li
          執(zhí)行JS腳本,獲取動(dòng)態(tài)加載數(shù)據(jù)

            browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
          from selenium import webdriver import time class JdSpider(object): def __init__
          (self): self.i= 0 self.url = 'https://www.jd.com/' self.browser =
          webdriver.Chrome()# 獲取頁(yè)面信息 - 到具體商品的頁(yè)面 def get_html(self):
          self.browser.get(self.url) self.browser.find_element_by_xpath('//*[@id="key"]'
          ).send_keys('爬蟲書') # 搜索框輸入“爬蟲書” self.browser.find_element_by_xpath('
          //*[@id="search"]/div/div[2]/button').click() # 點(diǎn)擊搜索 time.sleep(3) # 給商品頁(yè)面加載時(shí)間 #
          解析頁(yè)面 def parse_html(self): # 把下拉菜單拉到底部,執(zhí)行JS腳本 self.browser.execute_script('
          window.scrollTo(0,document.body.scrollHeight)') time.sleep(2) # 提取所有商品節(jié)點(diǎn)對(duì)象列表
          li列表 li_list = self.browser.find_elements_by_xpath('//*[@id="J_goodsList"]/ul/li
          ') for li in li_list: info_list = li.text.split('\n') if
          info_list[0].startswith('每滿') or info_list[1].startswith('¥'): price =
          info_list[1] name = info_list[2] comment = info_list[3] shop = info_list[4] elif
          info_list[0].startswith('單件'): price = info_list[3] name = info_list[4] comment
          = info_list[5] shop = info_list[6] else: price = info_list[0] name = info_list[1
          ] comment= info_list[2] shop = info_list[3] print(price, comment, shop, name) #
          主函數(shù) def main(self): self.get_html() while True: self.parse_html() #
          判斷是否該點(diǎn)擊下一頁(yè),沒有找到說(shuō)明不是最后一頁(yè) if self.browser.page_source.find('pn-next disabled') ==
          -1: self.browser.find_element_by_class_name('pn-next').click() time.sleep(2)
          else: break print(self.i) if __name__ == '__main__': spider = JdSpider()
          spider.main()
          chromedriver設(shè)置無(wú)界面模式
          from selenium import webdriver options = webdriver.ChromeOptions() # 設(shè)置無(wú)界面
          options.add_argument('--headless') # 添加無(wú)界面參數(shù) browser = webdriver.Chrome(options=
          options) browser.get('http://www.baidu.com/') browser.save_screenshot('baidu.png
          ') browser.quit()
          把上面的代碼改為無(wú)界面模式
          from selenium import webdriver import time class JdSpider(object): def __init__
          (self): self.url= 'https://www.jd.com/' self.options = webdriver.ChromeOptions()
          # 設(shè)置無(wú)界面 self.options.add_argument('--headless') # 添加無(wú)界面參數(shù) # 正常創(chuàng)建瀏覽器對(duì)象即可
          self.browser = webdriver.Chrome(options=self.options) self.i = 0 # 統(tǒng)計(jì)商品數(shù) #
          獲取頁(yè)面信息 - 到具體商品的頁(yè)面 def get_html(self): self.browser.get(self.url)
          self.browser.find_element_by_xpath('//*[@id="key"]').send_keys('爬蟲書') #
          搜索框輸入“爬蟲書” self.browser.find_element_by_xpath('
          //*[@id="search"]/div/div[2]/button').click() # 點(diǎn)擊搜索 time.sleep(3) # 給商品頁(yè)面加載時(shí)間
          def parse_html(self): # 把進(jìn)度條拉到底部,使所有數(shù)據(jù)動(dòng)態(tài)加載 self.browser.execute_script('
          window.scrollTo(0,document.body.scrollHeight)') time.sleep(2) # 等待動(dòng)態(tài)數(shù)據(jù)加載完成 #
          提取所有商品節(jié)點(diǎn)對(duì)象列表 li列表 li_list = self.browser.find_elements_by_xpath('
          //*[@id="J_goodsList"]/ul/li') item = {} for li in li_list: # find_element:
          查找單元素 item['name'] = li.find_element_by_xpath('.//div[@class="p-name"]/a/em'
          ).text.strip() item['price'] = li.find_element_by_xpath('
          .//div[@class="p-price"]').text.strip() item['comment'] =
          li.find_element_by_xpath('.//div[@class="p-commit"]/strong').text.strip() item['
          shop'] = li.find_element_by_xpath('.//div[@class="p-shopnum"]').text.strip()
          print(item) self.i += 1 def main(self): self.get_html() while True:
          self.parse_html()# 判斷是否為最后一頁(yè) if self.browser.page_source.find('pn-next disabled'
          ) == -1: self.browser.find_element_by_class_name('pn-next').click() time.sleep(3
          )else: break print('商品數(shù)量:', self.i) self.browser.quit() if __name__ == '__main__
          ': spider = JdSpider() spider.main() View Code
          鍵盤操作
          from selenium.webdriver.common.keys import Keys ? browser = webdriver.Chrome()
          browser.get('http://www.baidu.com/') # 1、在搜索框中輸入"selenium"
          browser.find_element_by_id('kw').send_keys('趙麗穎') # 2、輸入空格
          browser.find_element_by_id('kw').send_keys(Keys.SPACE) # 3、Ctrl+a 模擬全選
          browser.find_element_by_id('kw').send_keys(Keys.CONTROL, 'a') # 4、Ctrl+c 模擬復(fù)制
          browser.find_element_by_id('kw').send_keys(Keys.CONTROL, 'c') # 5、Ctrl+v 模擬粘貼
          browser.find_element_by_id('kw').send_keys(Keys.CONTROL, 'v') # 6、輸入回車,代替 搜索 按鈕
          browser.find_element_by_id('kw').send_keys(Keys.ENTER)
          鼠標(biāo)操作
          import time from selenium import webdriver # 導(dǎo)入鼠標(biāo)事件 from selenium.webdriver
          import ActionChains browser = webdriver.Chrome() browser.get('
          http://www.baidu.com/') # 找到“設(shè)置”節(jié)點(diǎn) element = browser.find_element_by_xpath('
          //*[@id="u1"]/a[8]') # 把鼠標(biāo)移動(dòng)到 設(shè)置 節(jié)點(diǎn),move_to_element() actions =
          ActionChains(browser) actions.move_to_element(element) actions.perform()#
          perform()是真正執(zhí)行操作 time.sleep(1) # 找到高級(jí)設(shè)置節(jié)點(diǎn),并點(diǎn)擊 browser.find_element_by_link_text(
          '高級(jí)搜索').click()
          切換頁(yè)面

          適用與頁(yè)面中點(diǎn)開鏈接出現(xiàn)新的頁(yè)面的網(wǎng)站,但是瀏覽器對(duì)象browser還是之前頁(yè)面的對(duì)象

          all_handles = browser.window_handles  獲取當(dāng)前所有句柄(窗口)

          browser.switch_to_window(all_handles[1])  切換browser到新的窗口,獲取新窗口對(duì)象

          民政部網(wǎng)站

          將民政區(qū)劃代碼爬取到數(shù)據(jù)庫(kù)中,按照層級(jí)關(guān)系(分表 -- 省表、市表、縣表)

          數(shù)據(jù)庫(kù)中建表
          # 建庫(kù) create database govdb charset utf8; use govdb; # 建表 create table
          province( p_namevarchar(20), p_code varchar(20) )charset=utf8; create table
          city( c_namevarchar(20), c_code varchar(20), c_father_code varchar(20) )charset=
          utf8;create table county( x_name varchar(20), x_code varchar(20), x_father_code
          varchar(20) )charset=utf8;
          思路

          * selenium+Chrome打開一級(jí)頁(yè)面,并提取二級(jí)頁(yè)面最新鏈接
          * 增量爬取: 和數(shù)據(jù)庫(kù)version表中進(jìn)行比對(duì),確定之前是否爬過(guò)(是否有更新)
          * 如果沒有更新,直接提示用戶,無(wú)須繼續(xù)爬取
          * 如果有更新,則刪除之前表中數(shù)據(jù),重新爬取并插入數(shù)據(jù)庫(kù)表
          * 最終完成后: 斷開數(shù)據(jù)庫(kù)連接,關(guān)閉瀏覽器 from selenium import webdriver import pymysql class
          GovSpider(object):def __init__(self): # 設(shè)置無(wú)界面 options =
          webdriver.ChromeOptions() options.add_argument('--headless') self.browser =
          webdriver.Chrome(options=options)# 添加參數(shù) self.one_url = '
          http://www.mca.gov.cn/article/sj/xzqh/2019/' # 創(chuàng)建數(shù)據(jù)庫(kù)和相關(guān)變量 self.db =
          pymysql.connect('localhost', 'root', '123456', 'govdb', charset='utf8')
          self.cursor= self.db.cursor() # 創(chuàng)建3個(gè)列表,用來(lái)executemany()往3張表中插入記錄
          self.province_list = [] self.city_list = [] self.county_list = [] #
          獲取首頁(yè),并提取二級(jí)頁(yè)面鏈接(虛假鏈接) def get_incr_url(self): self.browser.get(self.one_url) #
          提取最新鏈接,判斷是否需要增量爬 td = self.browser.find_element_by_xpath('
          //td[@class="arlisttd"]/a[contains(@title,"代碼")]') # 提取鏈接 和 數(shù)據(jù)庫(kù)中做比對(duì),確定是否需要怎倆那個(gè)抓取
          # get_attribute()會(huì)自動(dòng)補(bǔ)全提取的鏈接 two_url = td.get_attribute('href') #
          result為返回的受影響的條數(shù) result = self.cursor.execute('select url from version where
          url=%s', [two_url]) if result: print('無(wú)須爬取') else: td.click() # 切換句柄
          all_handlers = self.browser.window_handles
          self.browser.switch_to.window(all_handlers[1]) self.get_data() # 數(shù)據(jù)抓取 #
          把URL地址存入version表 self.cursor.execute('delete from version') self.cursor.execute(
          'insert into version values(%s)', [two_url]) self.db.commit() # 二級(jí)頁(yè)面中提取行政區(qū)劃代碼
          def get_data(self): # 基準(zhǔn)xpath tr_list = self.browser.find_elements_by_xpath('
          //tr[@height="19"]') for tr in tr_list: code = tr.find_element_by_xpath('./td[2]
          ').text.strip() name = tr.find_element_by_xpath('./td[3]').text.strip() print
          (name, code)# 判斷層級(jí)關(guān)系,添加到對(duì)應(yīng)的數(shù)據(jù)庫(kù)表中(對(duì)應(yīng)表中字段) # province: p_name p_code # city :
          c_name c_code c_father_code # county : x_name x_code x_father_code # 把數(shù)據(jù)添加到對(duì)應(yīng)的表中
          if code[-4:] == '0000': self.province_list.append([name, code]) if name in ['北京市
          ', '天津市', '上海市', '重慶市']: self.city_list.append([name, code, code]) elif
          code[-2:] =='00': self.city_list.append([name, code, (code[:2] + '0000')]) else:
          if code[:2] in ['11', '12', '31', '50']: self.county_list.append([name, code,
          (code[:2] + '0000')]) else: self.county_list.append([name, code, (code[:4] + '00
          ')]) # # 和for循環(huán)同縮進(jìn),所有數(shù)據(jù)爬完后統(tǒng)一excutemany(), # 執(zhí)行數(shù)據(jù)庫(kù)插入語(yǔ)句 self.insert_mysql() def
          insert_mysql(self):# 1. 更新時(shí)一定要先刪除表記錄 self.cursor.execute('delete from province'
          ) self.cursor.execute('delete from city') self.cursor.execute('delete from
          county') # 2. 插入新數(shù)據(jù) self.cursor.executemany('insert into province values(%s,%s)'
          , self.province_list) self.cursor.executemany('insert into city values(%s,%s,%s)
          ', self.city_list) self.cursor.executemany('insert into county values(%s,%s,%s)'
          , self.county_list)# 3.提交到數(shù)據(jù)庫(kù)執(zhí)行 self.db.commit() print('數(shù)據(jù)抓取完成,成功存入數(shù)據(jù)庫(kù)') def
          main(self): self.get_incr_url() self.cursor.close()# 所有數(shù)據(jù)處理完成后斷開連接
          self.db.close() self.browser.quit()# 關(guān)閉瀏覽器 if __name__ == '__main__': spider =
          GovSpider() spider.main()
          SQL命令練習(xí)

          1. 查詢所有省市縣信息(多表查詢實(shí)現(xiàn))
          select province.p_name,city.c_name,county.x_name from province,city,county
          where province.p_code=city.c_father_code and city.c_code=county.x_father_code;
          2. 查詢所有省市縣信息(連接查詢實(shí)現(xiàn))
          select province.p_name,city.c_name,county.x_name from province inner join city
          on province.p_code=city.c_father_code inner join county on city.c_code=
          county.x_father_code;
          Web客戶端驗(yàn)證

          在URL地址中填入即可

          url = 'http://用戶名:密碼@正常地址'

          示例: 爬取某一天筆記
          from selenium import webdriver ? url = '
          http://tarenacode:[email protected]/AIDCode/aid1904/15-spider/spider_day06_note.zip
          ' browser = webdriver.Chrome() browser.get(url)
          iframe子框架

          iframe子框架適用于網(wǎng)頁(yè)中嵌套了網(wǎng)頁(yè),這種情況應(yīng)該先切換到iframe子框架,然后再執(zhí)行其他操作。

          browser.switch_to.iframe(iframe_element)

          示例 - 登錄qq郵箱
          import time from selenium import webdriver browser = webdriver.Chrome()
          browser.get('https://mail.qq.com/cgi-bin/loginpage') # 找iframe子框架并切換到此iframe
          login_frame = browser.find_element_by_id('login_frame')
          browser.switch_to.frame(login_frame)# qq+密碼+登錄 browser.find_element_by_id('u'
          ).send_keys('賬號(hào)') browser.find_element_by_id('p').send_keys('密碼')
          browser.find_element_by_id('login_button').click() time.sleep(5) # 預(yù)留頁(yè)面記載時(shí)間 #
          提取數(shù)據(jù) ele = browser.find_element_by_id('useralias') print(ele.text)
          ?

          友情鏈接
          ioDraw流程圖
          API參考文檔
          OK工具箱
          云服務(wù)器優(yōu)惠
          阿里云優(yōu)惠券
          騰訊云優(yōu)惠券
          京東云優(yōu)惠券
          站點(diǎn)信息
          問題反饋
          郵箱:[email protected]
          QQ群:637538335
          關(guān)注微信

                女人男人交性爽视频 | 室友顶撞喘嗯啊h | 亚洲女人在线 | 超碰日韩在线 | 韩国下部无遮挡 |