爬虫实战(自用)requests模块、聚焦爬虫(数据解析)、selenium模块
一、requests模塊
一、爬取搜狗首頁的頁面數(shù)據(jù)
import requests # 指定url # 發(fā)起請求,get方法會返回一個響應(yīng)對象 res=requests.get(r'https://www.sogou.com/') # 獲取響應(yīng)數(shù)據(jù),text返回字符串類型的響應(yīng)數(shù)據(jù) str=res.text print(str) # 持久化存儲 with open('./sogou.html','w',encoding='utf-8') as fp:fp.write(str) print('爬取結(jié)束')結(jié)果:
二、爬取搜狗指定詞條對應(yīng)的搜索結(jié)果頁面(簡易網(wǎng)頁采集器)
網(wǎng)址中有很多字母數(shù)字,我們只選擇出有用的部分:
這么處理以后,頁面還是一樣的!
粘貼到Pycharm中會自動編碼。(使用中文也沒問題)
UA檢測與UA偽裝
UA:User-Agent(請求載體的身份標(biāo)識)
我們使用requess.get去請求網(wǎng)頁就不再是以瀏覽器的身份去訪問,而是以爬蟲程序去訪問,門戶網(wǎng)站的服務(wù)器會檢測對應(yīng)請求的載體身份標(biāo)識,如果檢測到為某一款瀏覽器,這個請求會被當(dāng)作正常用戶請求。
但是,如果檢測到不是基于瀏覽器訪問,則被視為不正常請求!(爬蟲),則服務(wù)器很有可能拒絕該請求!
查詢User-Agent:
所以我們一定要進(jìn)行UA偽裝!!! 偽裝成某一款瀏覽器。
import requests if __name__=='__main__':# UA偽裝:將user-agent封裝到字典中headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36'}url='https://www.sogou.com/web'# 處理url攜帶的參數(shù):封裝到字典中(因為要動態(tài)收集)kw=input('enter a word:')param={'query':kw}# 對指定的url發(fā)起的請求對應(yīng)的url是攜帶參數(shù)的,并且請求過程中處理了參數(shù)# headers代表頭信息(用于UA偽裝)response=requests.get(url=url,params=param,headers=headers)page_text=response.textfileName=kw+'.html'with open(fileName,'w',encoding='utf-8') as fp:fp.write(page_text)print(fileName,'保存成功!!!')三、破解百度翻譯
比較翻譯前后的url:
https://fanyi.baidu.com/?aldtype=16047#auto/zh/# 翻譯dog https://fanyi.baidu.com/?aldtype=16047#en/zh/dog# 翻譯狗 https://fanyi.baidu.com/?aldtype=16047#zh/en/%E7%8B%97(這里也可以寫成狗)它實際上是在你輸入內(nèi)容后進(jìn)行局部頁面刷新(不用你自己刷新)從而實現(xiàn)翻譯。
通過使用谷歌自帶抓包工具,進(jìn)行抓包,沒輸入一個字符就觀察一次,因為它涉及到局部頁面刷新,屬于ajax請求,所以要在Network中選擇XHR進(jìn)行查看。
最后發(fā)現(xiàn),是第三個sug中包含了我們輸入的參數(shù)dog,所以我們只需要這個內(nèi)容中的URL地址。
并且可以看到,返回的數(shù)據(jù)為json串。(就是我們想要的數(shù)據(jù))
從Content-Type可以看出響應(yīng)數(shù)據(jù)的類型!
Post和Get的區(qū)別(使用不同函數(shù))
data和params一樣都用來處理參數(shù)。
上面的kw:dog就代表它的參數(shù)
實際上就是post是要攜帶用戶信息的請求方式,get則是根據(jù)URL直接獲取網(wǎng)頁信息(即某個網(wǎng)址所包含的信息)。
post要獲取的內(nèi)容只靠網(wǎng)址是不能獲取到的,需要提交一些額外的信息,這種信息在不同的網(wǎng)頁中發(fā)揮不同功能。 例如在查詢天氣的網(wǎng)頁,可能就是要輸入城市信息;在登錄某些網(wǎng)頁時,又是賬號和密碼的載體。從這些可以看出get方法獲取到的內(nèi)容是穩(wěn)定的(即每個人打開某個網(wǎng)頁獲得的信息相同),但是使用post需要輸入特定信息,那么得到的網(wǎng)頁內(nèi)容就會有特異性。
post每次獲取某個特定網(wǎng)頁都需要輸入額外信息,但get則直接輸入URL即可(),這樣也能看出post方法更加安全,因為額外信息不會直接暴露在網(wǎng)址上。
(百度翻譯是post,因為需要我們向它傳遞dog這個數(shù)據(jù),它才會返回值)
import requests import json if __name__=="__main__":# 1、指定urlpost_url='https://fanyi.baidu.com/sug'# 2、進(jìn)行UA偽裝headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36'}# 3、post請求參數(shù)處理(同get請求一致)data={'kw':'dog'}# 4、請求發(fā)送response=requests.post(url=post_url,data=data,headers=headers)# 5、獲取響應(yīng)數(shù)據(jù)(返回的是json)使用.json()返回的是對象# 如果確認(rèn)服務(wù)器響應(yīng)數(shù)據(jù)是json類型的,才可以使用.json()dic_obj=response.json()# print(dic_obj)# 6、持久化存儲fp=open('./dog.json','w',encoding='utf-8')# 使用json.dump存儲json文件,因為結(jié)果有中文,中文不支持ascii碼,所以要設(shè)置為Falsejson.dump(dic_obj,fp=fp,ensure_ascii=False)print('Over!!!')
使用[‘data’]即可獲取data部分的list,進(jìn)而使用它的相關(guān)數(shù)據(jù)。
在翻譯dog的基礎(chǔ)上,我們同樣可以將dog設(shè)置成一個參數(shù),通過我們傳入的參數(shù)不同以達(dá)到獲取不同單詞的翻譯結(jié)果。
動態(tài)化獲取:
import requests import json if __name__=="__main__":# 1、指定urlpost_url='https://fanyi.baidu.com/sug'# 2、進(jìn)行UA偽裝headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36'}# 3、post請求參數(shù)處理(同get請求一致)word=input('enter a word:')data={'kw':word}# 4、請求發(fā)送response=requests.post(url=post_url,data=data,headers=headers)# 5、獲取響應(yīng)數(shù)據(jù)(返回的是json)使用.json()返回的是對象# 如果確認(rèn)服務(wù)器響應(yīng)數(shù)據(jù)是json類型的,才可以使用.json()dic_obj=response.json()# print(dic_obj)# 6、持久化存儲filename='./'+word+'.json'fp=open(filename,'w',encoding='utf-8')# 使用json.dump存儲json文件,因為結(jié)果有中文,中文不支持ascii碼,所以要設(shè)置為Falsejson.dump(dic_obj,fp=fp,ensure_ascii=False)print('Over!!!')四、爬取豆瓣電影分類排行榜
進(jìn)入這個網(wǎng)址:豆瓣
當(dāng)滑動滾輪時,滑到底部的時候頁面會進(jìn)行刷新使得右邊的滑塊又跑到了中央,所以我們可以利用這次刷新進(jìn)行數(shù)據(jù)收集。
經(jīng)過驗證,確實是產(chǎn)生了ajax請求,和上面百度翻譯類似。
下面是攜帶的五個參數(shù)。
意思就是說:我們讓這個url發(fā)送get請求,并攜帶參數(shù),就可以獲取到響應(yīng)的json文件,再進(jìn)行持續(xù)化存儲。
從?后開始到最后就是傳遞的參數(shù),我們使用字典存儲,也方便之后動態(tài)化。
我們也可以通過下圖來獲取具體的參數(shù),直接復(fù)制到字典中存儲即可。
根據(jù)每次滑動的變化,我們可以對每個參數(shù)值的含義進(jìn)行猜測:(見代碼)
第一部電影確實是憨豆先生,實現(xiàn)了爬取。
(之后就是進(jìn)一步的數(shù)據(jù)處理)
五、爬取肯德基餐廳查詢
進(jìn)入網(wǎng)址:http://www.kfc.com.cn/kfccda/storelist/index.aspx
發(fā)現(xiàn),這又是一個局部網(wǎng)頁刷新,所以和之前豆瓣一樣,通過比對輸入關(guān)鍵字前后抓包發(fā)生的變化,從而實現(xiàn)爬取。
六、爬取國家藥品監(jiān)督管理總局中基于中華人民共和國化妝品生產(chǎn)許可證相關(guān)數(shù)據(jù)(綜合實戰(zhàn))
動態(tài)加載
import requests if __name__=="__main__":url='http://scxk.nmpa.gov.cn:81/xk/'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36'}response=requests.get(url=url,headers=headers)print(response.text)驗證后發(fā)現(xiàn),它并不是直接通過html實現(xiàn)數(shù)據(jù)的顯示,可能是ajax實現(xiàn),再進(jìn)行驗證。
也可以直接抓包,看對應(yīng)的url是否有需要的數(shù)據(jù):
這些由其它請求產(chǎn)生的數(shù)據(jù),我們可以叫他們是動態(tài)加載出來的數(shù)據(jù)!
進(jìn)行ajax抓包驗證:
可以發(fā)現(xiàn),首頁的數(shù)據(jù)是由ajax提供的!
但我們需要的是每一家企業(yè)的詳情頁中的所有信息,該如何處理呢?
我們發(fā)現(xiàn),每一行公司數(shù)據(jù)中都包含著一個ID數(shù)據(jù),我們點開其中一個,進(jìn)入詳情頁:
發(fā)現(xiàn),該詳情頁的url是通過id來進(jìn)行訪問的,意思是每個id都對應(yīng)了一個唯一的詳情頁面,我們可以先獲取它的id,再以它的id為參數(shù),進(jìn)行詳情頁面的請求,即可實現(xiàn)詳細(xì)信息的爬取。
我們對詳情頁進(jìn)行抓包,又發(fā)現(xiàn):
這個網(wǎng)頁又是ajax刷新出來的動態(tài)網(wǎng)頁,所以又可以通過之前的處理辦法,提取其中的json文件:
同時也發(fā)現(xiàn)了它的參數(shù)(id)如下:
域名和id值進(jìn)行拼接,拼接出一個完整的企業(yè)對應(yīng)的詳情頁url。
注意:如果是post型,一定要記得傳入?yún)?shù)!否則什么都得不到,因為post需要你向服務(wù)器提供數(shù)據(jù),它才會返回相關(guān)的數(shù)據(jù)給你!
我們先對具體的詳情頁面進(jìn)行試驗,發(fā)現(xiàn)可以進(jìn)行爬取:
import requests import json if __name__=="__main__":url='http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36'}data={'id': 'ed59438f34ae47e794f4c7ee5137c1f7',}response=requests.post(url=url,data=data,headers=headers)list_data=response.json()fp=open('./藥監(jiān)局.json','w',encoding='utf-8')json.dump(list_data,fp=fp,ensure_ascii=False)print('Over!!!')接下來的任務(wù)就是將首頁中獲取的id與詳情頁面的url聯(lián)系在一起,從而實現(xiàn)詳情頁的爬取:
import requests import pandas as pd import json if __name__=="__main__":# 1、批量獲取不同企業(yè)的id值url='http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList'# 首頁的請求為post,返回值為jsonheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36'}# 傳入post所需參數(shù)data={'on': 'true','page': '1', #代表第幾頁'pageSize': '15','productName':'','conditionType': '1','applyname':'','applysn':'',}response=requests.post(url=url,data=data,headers=headers)list_data=response.json()['list']list_id=[]for i in list_data:# 存入相關(guān)的id(共15個)list_id.append(i['ID'])# print(i)# print(list_id)# ['ed59438f34ae47e794f4c7ee5137c1f7', 'd5046c860bbb4e5198fa0dd99382b262', '8bc468fcdb83488681c616d2f7c59149',# '5e45595403cc4509a266666a8a513c46', '246c9e4e2ad64e3f9518908e97a826f7', '76ec5f5a9048457986029282d0f99551',# '670daa3bed864e029c4a17479314240b', '6aab6520cc164b9c9a86d3b5a371152e', 'e8d9c8e820f64c9b8b4c913bafdffecc',# 'f546d7d0b7a34944814291e2c0808500', 'aa42d5a6f10349b98f2fea44867a792c', '7b11ca443c804922815a9410e1fc6c3a',# '72cf694b44a34627b27f6174332b69b1', '47cad475ffb6445da68a8eb83d89fd5f', '165b8a8d86314d5096ebe4e97ca0dd31']# 2、獲取企業(yè)詳情數(shù)據(jù)post_url='http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById'# 同樣也是post型,需要傳入具體的參數(shù)final_data=[]for i in list_id:# 遍歷之前我們獲取到的每一個id,進(jìn)行每一個數(shù)據(jù)的讀取post_data = {'id': i}post_response = requests.post(url=post_url, data=post_data, headers=headers)final_data.append(post_response.json())final_data=pd.DataFrame(final_data)# 將數(shù)據(jù)存入csv表格中# csv表格的編碼為gbk,pycharm自帶的編碼是utf-8final_data.to_csv('藥監(jiān)局.csv',encoding='gbk')
進(jìn)一步,對所有頁碼進(jìn)行遍歷:(就是多了個循環(huán),用于對頁碼進(jìn)行遍歷)
二、聚焦爬蟲(數(shù)據(jù)解析)
數(shù)據(jù)解析原理:使用數(shù)據(jù)解析,是因為有一些數(shù)據(jù)存在于標(biāo)簽之間或者在標(biāo)簽對應(yīng)的屬性值中。我們需要定位到具體標(biāo)簽的位置,或是標(biāo)簽相應(yīng)的屬性的位置,再獲取標(biāo)簽中相關(guān)的數(shù)據(jù)。
大致有三類:
1、正則(適用于多種語言)
2、bs4(僅適用于Python)
3、xpath(重要)
編碼流程變?yōu)?#xff1a;
1、指定url
2、發(fā)起請求
3、獲取相應(yīng)數(shù)據(jù)
4、數(shù)據(jù)解析
5、持久化存儲
一、正則解析(爬取糗事百科中糗圖中所有的圖片)
從網(wǎng)站中可以看到:
圖片是存儲在具體的一個網(wǎng)頁中的。
步驟如下:先獲取一整個頁面,再對這個頁面進(jìn)行解析,獲取其中的圖片。
進(jìn)行滑動后發(fā)現(xiàn),它并不會像豆瓣一樣動態(tài)更新,而是直接一頁顯示完,我們可以通過遍歷page來獲取所有圖片。
可以發(fā)現(xiàn),紅框標(biāo)簽中包含了這一頁的所有糗圖。
進(jìn)一步發(fā)現(xiàn),在每一個糗圖子類中的thumb標(biāo)簽下,存儲了糗圖(只有糗圖,沒有其他文字):
img src中存放的就是圖片的地址(.jpg):
二、bs4數(shù)據(jù)解析
soup提供的用于數(shù)據(jù)解析的函數(shù)
1、soup.tagName(自己輸入)
這里的html head body div都是tagName(標(biāo)簽名)
它只返回第一次出現(xiàn)的tagName對應(yīng)的標(biāo)簽,不能返回多個。
2、soup.find()
1)soup.find(‘div’)等同于soup.div
2)屬性定位(根據(jù)具體屬性定位到對應(yīng)屬性的標(biāo)簽)
soup.find(‘div’,class_/id/attr=‘song’)(這里class要加下劃線,不然會被當(dāng)作關(guān)鍵字)
3、soup.find_all()
find_all會返回符合要求的所有標(biāo)簽,用法同soup.find()
4、soup.select()
需要傳入某種選擇器(id、類、標(biāo)簽選擇器),返回是一個列表
class選擇器:.類名
標(biāo)簽選擇器:直接寫標(biāo)簽名
id選擇器:#Id
層級選擇器:
(大于號表示一個層級,也可以將大于號替換為空格,代表之間有多個層級)
soup.select(’.tang > ul > li > a’):查找.tang類下的ul標(biāo)簽下的li標(biāo)簽下的a標(biāo)簽
print(soup.select('div .thumb > a > img'))選擇div標(biāo)簽中類名為thumb的類下面的標(biāo)簽為a的下面的標(biāo)簽為img的內(nèi)容。
獲取標(biāo)簽中的文本數(shù)據(jù)
之前是定位到具體的標(biāo)簽,現(xiàn)在是利用定位到的具體標(biāo)簽來提取其中的數(shù)據(jù)。
soup.a.text/string/get_text(),用于讀取文本數(shù)據(jù)
text/get_text():可以獲取一個標(biāo)簽中的所有文本內(nèi)容
string:只可以獲取該標(biāo)簽下面直系的文本內(nèi)容
我們上面想要的src不屬于文本數(shù)據(jù)!
獲取標(biāo)簽中屬性值
直接使用 [ 屬性名 ]
print(soup.select('div .thumb a img')[0]['src'])我們成功從中提取到了src!!!
//pic.qiushibaike.com/system/pictures/12405/124058306/medium/X8FX01T2TYWYF66L.jpg三、bs4實戰(zhàn):爬取三國演義小說所有的章節(jié)標(biāo)題和章節(jié)內(nèi)容
這個跟爬取藥監(jiān)局的例子相似,需要現(xiàn)在主頁面獲取到每一個子頁面的url,再對每一個子頁面進(jìn)行訪問,讀取子頁面中的文本內(nèi)容。
這個網(wǎng)站并不是動態(tài)加載(ajax),而是將具體網(wǎng)址寫入標(biāo)簽屬性中,所以需要用到數(shù)據(jù)解析!(藥監(jiān)局那個是動態(tài)加載)
四、xpath解析
最常用且最便捷高效的一種新方法,通用性。
xpath解析原理:
1、實例化一個etree的對象,且需要將被解析的頁面源碼數(shù)據(jù)加載到該對象中
2、調(diào)用etree對象中的xpath方法,結(jié)合著xpath表達(dá)式實現(xiàn)標(biāo)簽的定位和內(nèi)容的捕獲
如何實例化一個etree對象:from lxml import etree
1、將本地html文檔重點源碼數(shù)據(jù)加載到etree對象中:
etree.parse(filePath)
2、可以將從互聯(lián)網(wǎng)上獲取的源碼加載到該對象中:
etree.HTML(‘page_text’)
xpath(‘xpath表達(dá)式’),返回一個列表!
response=requests.get(url=url,headers=headers).texttree=etree.HTML(response)r=tree.xpath('/html/head/title')r=tree.xpath('/html//div')r=tree.xpath('//div')/ 表示從根節(jié)點開始,一個 / 表示一個層級,而//表示多個層級,或者表示可以從任意位置開始定位。(所有)
屬性定位:
tagName[@attrName=“attrValue”]
r=tree.xpath('//div[@class="song"]')索引定位:
r=tree.xpath('//div[@class="song"]/p')表示div標(biāo)簽下,類名為song下的p標(biāo)簽,可以在后面使用 [1] 索引,從1開始!!!
取文本:
r=tree.xpath('//div[@class="song"]/ul/li[1]/a/text()')# 返回結(jié)果為列表取得,a標(biāo)簽下的文本內(nèi)容。
/text(),獲取的是標(biāo)簽中直系的文本內(nèi)容
//text(),獲取的是標(biāo)簽中非直系(所有的)文本內(nèi)容
取屬性:
r=tree.xpath('//div[@class="song"]/img/@src')# 返回結(jié)果為列表/@屬性名 (/@src,獲取img標(biāo)簽下的src屬性)
五、xpath解析實戰(zhàn):58二手房
三、selenium模塊的基本使用
一、引入
回顧一下,我們是怎么判斷網(wǎng)頁中的數(shù)據(jù)是否為動態(tài)加載:
打開抓包工具,在當(dāng)前網(wǎng)頁的url對應(yīng)內(nèi)容中進(jìn)行搜索,看是否有相應(yīng)的內(nèi)容:
搜索不到,顯然就是動態(tài)加載的!
那如何快速,準(zhǔn)確的找到需要的數(shù)據(jù)在哪里呢?
在紅框中按下 ctrl + f 輸入你需要查詢的信息,進(jìn)行搜索。
可以發(fā)現(xiàn),如果使用像上面的方法進(jìn)行查找的話,會比較耗時,我們就需要使用selenium模塊!
二、selenium模塊
1、作用
1、它能幫助便捷的獲取網(wǎng)站中動態(tài)加載的數(shù)據(jù)!
2、便捷地使用模擬登陸!
selenium是基于瀏覽器自動化的一個模塊。(就是自動地使用瀏覽器的相關(guān)功能,讓他自己去操縱瀏覽器,不用我們自己去弄)
2、使用流程
環(huán)境安裝:pip install selenium
下載一個瀏覽器的驅(qū)動程序:
http://npm.taobao.org/mirrors/chromedriver/
驅(qū)動程序和版本要對應(yīng)。對照表
再把驅(qū)動放在你項目的文件夾中。
實例化一個瀏覽器對象(傳入瀏覽器的驅(qū)動程序)
用代碼操縱你的瀏覽器!
以藥監(jiān)局的例子為例:
1、先操縱瀏覽器打開藥監(jiān)局的網(wǎng)站:
from selenium import webdriver # 實例化一個瀏覽器對象(傳入瀏覽器的驅(qū)動程序) bro=webdriver.Chrome(executable_path='./chromedriver.exe') # 對指定網(wǎng)頁發(fā)送請求 bro.get('http://scxk.nmpa.gov.cn:81/xk/')2、獲取瀏覽器當(dāng)前頁面的頁面源碼數(shù)據(jù)(公司名字)
from selenium import webdriver from lxml import etree from time import sleep # 實例化一個瀏覽器對象(傳入瀏覽器的驅(qū)動程序) bro=webdriver.Chrome(executable_path='./chromedriver.exe') # 對指定網(wǎng)頁發(fā)送請求 bro.get('http://scxk.nmpa.gov.cn:81/xk/') # 獲取瀏覽器當(dāng)前頁面的源碼數(shù)據(jù) page_text=bro.page_source# 解析企業(yè)名稱(以xpath為例) tree=etree.HTML(page_text) li_list=tree.xpath('//ul[@id="gzlist"]/li') for li in li_list:name=li.xpath('./dl/@title')[0]print(name) # 關(guān)閉瀏覽器 sleep(5) #暫停五秒后關(guān)閉 bro.quit()3、其他自動化操作(以淘寶搜索為例)
我們要先找到搜索框在哪里?
打開檢查,找到搜索框?qū)?yīng)的源碼,發(fā)現(xiàn)里面有一個input標(biāo)簽,id=‘q’。
標(biāo)簽定位:
如何向搜索框中傳值呢?
search_input=bro.find_element_by_id('q') # 標(biāo)簽交互(傳入想輸入搜索框的東西) search_input.send_keys('Iphone')我們還需要點擊搜索按鈕,我們再去找搜索按鈕對應(yīng)的源碼:
它有兩個標(biāo)簽名,用哪一個都行但不能一起用!
因為沒有登錄,所以運行結(jié)果如下:
如何實現(xiàn)頁面滾輪下滑效果呢?
進(jìn)入網(wǎng)頁檢查中的console輸入:
即可實現(xiàn)滾輪效果,現(xiàn)在需要使得程序知道怎么操作。
三、selenium處理iframe
什么是iframe???
用于實現(xiàn)網(wǎng)頁的嵌套。
我們來看看如何拖動一個方塊:
我們先找到需要被拖動方塊的源碼。
為什么會報錯呢?
它說沒有找到我們想要的標(biāo)簽,我們id也沒有輸錯。
原因:
它是包含在一個叫做iframe的標(biāo)簽下,所以才導(dǎo)致程序無法找到。
如何定位的標(biāo)簽存在于iframe標(biāo)簽之中,直接尋找是尋找不到的!
實現(xiàn)在iframe下的定位:
from selenium import webdriver from time import sleepbro=webdriver.Chrome(executable_path='./chromedriver.exe')bro.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable') # 如何定位的標(biāo)簽存在于iframe標(biāo)簽之中,直接尋找是尋找不到的! # 傳入的參數(shù)是Id bro.switch_to.frame('iframeResult') #切換瀏覽器標(biāo)簽定位的作用域(默認(rèn)為最外面大的html標(biāo)簽)div=bro.find_element_by_id('draggable')模擬人操作鼠標(biāo),進(jìn)行滑塊的拖動:
from selenium import webdriver from time import sleep # 導(dǎo)入動作鏈對應(yīng)的類 from selenium.webdriver import ActionChainsbro=webdriver.Chrome(executable_path='./chromedriver.exe')bro.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable') # 如何定位的標(biāo)簽存在于iframe標(biāo)簽之中,直接尋找是尋找不到的! # 傳入的參數(shù)是Id bro.switch_to.frame('iframeResult') #切換瀏覽器標(biāo)簽定位的作用域(默認(rèn)為最外面大的html標(biāo)簽) div=bro.find_element_by_id('draggable') # 動作鏈 action=ActionChains(bro) # 點擊長按指定的標(biāo)簽 action.click_and_hold(div)for i in range(5):# perform()立即執(zhí)行動作鏈操作action.move_by_offset(17,0).perform() #做移動偏移(x,y)傳入水平、豎直方向偏移sleep(0.3) # 釋放工作鏈 action.reset_actions()bro.quit()四、selenium模擬登錄(模擬登錄QQ空間)
主要就是紅框中的三個模塊:賬號、密碼、登錄按鈕。
由于,默認(rèn)情況下,是要我們進(jìn)行掃碼,我們還需要點擊右下角賬號密碼登錄。
注意!這里的賬號密碼登錄還是在iframe標(biāo)簽下!!所以不能直接請求。
定位賬號和密碼:
現(xiàn)在不能直接登錄,需要進(jìn)行滑塊驗證!
五、讓瀏覽器不可視(無頭瀏覽器)
from selenium import webdriver from selenium.webdriver.chrome.options import Options# 無可視化參數(shù) chrome_options=Options() chrome_options.add_argument('--headless') chrome_options.add_argument('--disable-gpu')bro=webdriver.Chrome(executable_path='./chromedriver.exe',options=chrome_options) bro.get('https://www.baidu.com')六、規(guī)避selenium被網(wǎng)站檢測
from selenium import webdriver # 實現(xiàn)無頭瀏覽器 from selenium.webdriver.chrome.options import Options # 實現(xiàn)規(guī)避檢測 from selenium.webdriver import ChromeOptions# 無可視化參數(shù) chrome_options=Options() chrome_options.add_argument('--headless') chrome_options.add_argument('--disable-gpu')# 如何讓selenium規(guī)避被檢測到的風(fēng)險 option=ChromeOptions() option.add_experimental_option('excludeSwitches',['enable-automation'])bro=webdriver.Chrome(executable_path='./chromedriver.exe',chrome_options=chrome_options,options=option) bro.get('https://www.baidu.com')總結(jié)
以上是生活随笔為你收集整理的爬虫实战(自用)requests模块、聚焦爬虫(数据解析)、selenium模块的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国标中不能用作公差基准字母
- 下一篇: iOS category内部实现原理