魔法世家
一、單項選擇題(本大題共15小題,每小題2分,共30分)
1、下列不屬于常見爬蟲類型的是(?淺層網(wǎng)絡(luò)爬蟲)。
A、 淺層網(wǎng)絡(luò)爬蟲
B、 聚焦網(wǎng)絡(luò)爬蟲
C、 增量式網(wǎng)絡(luò)爬蟲????
D、 通用網(wǎng)絡(luò)爬蟲
答案: A
2、下列哪項不屬于解析網(wǎng)頁的庫?(?requests??)
A、 lxml
B、 beautifulsoup4
C、 正則表達(dá)式
D、 requests
答案: D
3、通過設(shè)置HTTP請求的哪個參數(shù)可以實(shí)現(xiàn)偽裝成瀏覽器訪問網(wǎng)頁?(headers? )
A、 params
B、 data
C、 headers
D、 timeout
答案: C
4、下列哪個函數(shù)可以實(shí)現(xiàn)合并URL?(?urljoin()?)
A、 urlpase()
B、 urlencode()
C、 urljoin()
D、 quote()
答案: C
5、下列不屬于Response對象屬性的是(?txt?)。
A、 content
B、 txt
C、 text
D、 encoding
答案: B
6、下列不屬于HTML標(biāo)簽的是(?href??)。
A、 href
B、 head
C、 a
D、 li
答案: A
7、lxml庫中選取屬性的語法是(?@?)。
A、 @
B、 .
C、 *
D、 //
答案: A
8、能夠在字符串“aabaaabaaaab”中匹配“aab”,而不能匹配“aaab”和“aaaab”的正則表達(dá)式為(?aa??b??)。
A、 a{1,3}b
B、 aa??b
C、 aaa??b
D、 a*?b
答案: B
9、beautifulsoup4 庫中遍歷整個HTML文件,按照條件返回所有匹配的節(jié)點(diǎn)元素的方法是(?find_all()?? )
A、 find()
B、 select()
C、 find_all()
D、 search()
答案: C
10、下列關(guān)于XPath描述錯誤的是(?contains()方法可用于選取以特定值開頭的節(jié)點(diǎn)?)。
A、 text()方法可提取節(jié)點(diǎn)的文本內(nèi)容
B、 text()方法可用于選取包含指定文本內(nèi)容的節(jié)點(diǎn)
C、 contains()方法可用于選取以特定值開頭的節(jié)點(diǎn)
D、 and可用于選取同時包含兩種指定值的節(jié)點(diǎn)
答案: C
11、下列關(guān)于beutiflsoup4中Tag對象描述錯誤的是(??attrs 屬性可獲取Tag對象的HTML屬性,返回值為列表形式?).
?
A、 string屬性可獲取Tag對象中的文本字符串內(nèi)容
B、 ?attrs 屬性可獲取Tag對象的HTML屬性,返回值為列表形式
C、 contents屬性可獲取Tag對象子標(biāo)簽的內(nèi)容
D、 name 屬性可獲取Tag對象的名稱
?
答案: B
12、下列關(guān)于json庫中dumps()方法描述錯誤的是(?dumps()方法可將JSON對象寫入文件內(nèi)?)。
A、 設(shè)置indent參數(shù)為2時,輸出時縮進(jìn)2個字符
B、 如果需要輸出中文字符,設(shè)置ensure_ascii 參數(shù)為True
C、 dumps()方法可將JSON對象寫入文件內(nèi)
D、 dumps()方法可生成一個字符串
?
答案: C
13、逆向分析請求頁面和取動態(tài)加載數(shù)據(jù)時選擇Network面板的哪個選項查看JavaScript加載的文件? (? ?XHR? ? )
A、 CSS
B、 Doc
C、 XHR
D、 Media
答案: C
14、下列Selenium庫的方法中,不能通過節(jié)點(diǎn)屬性進(jìn)行多元素定位的是(?find _element _by_ name()?? ?)。
A、 find _element _by_ name()?
B、 find_ elements_ by_class_name()?
C、 ?find_elements_by_name()?
D、 find_ elements_ by _id()?
答案: A
15、以下選項中哪一個不是正則表達(dá)式的元字符(?@? ?).
A、 $
B、 @
C、 ^
D、 *
答案: B
16、Selenium中提供了多種元素定位方法,但不包括以下選項中的(?find_ element by_ page()?? )
A、 find_ element_ by_ id()
B、 find_ element_ by_ xpath()?
C、 find_ element by_ page()
D、 find _element by_ class_ name()
答案: C
17、使用selenium模塊打開谷歌瀏覽器,以下選項中正確的是(?webdriver.Chrome()?? )
A、 webdriver.Google
B、 webdriver.Google()
C、 webdriver.Chrome?
D、 webdriver.Chrome()
答案: D
18、以下正則表達(dá)式中,屬于非貪婪匹配, 且允許出現(xiàn)0次的是(.*??)
A、 .
B、 .*
C、 .*?
D、 .+?
答案: C
19、正則表達(dá)式R[0-9]{3},能匹配出以下哪個字符串(?R093?)
A、R3
B、 R03
C、 R09
D、 R093
?
答案: D
20、MySQL數(shù)據(jù)庫默認(rèn)端口號是(?3306?)。
A、 8888
B、 27017
C、 3306
D、 6379
答案: C
21、下列哪個函數(shù)可以實(shí)現(xiàn)不同模式圖像之間的轉(zhuǎn)換。(?convert()?)
A、 show()
B、 convert()
C、 open()
D、 save()
答案: B
22、<div id="wrapper">,使用selenium中的方法定位該標(biāo)簽,以下選項中正確的是(?find_element_by_id("wrapper")?)。
A、 find_element_by_id("wrapper")?
B、 find_element_by_id("wrapper_new ")?
C、 find_element_by_class("wrapper_new ")?
D、 以上都可以?
答案: A
23、關(guān)于open函數(shù)的操作模式,以下選項中哪一種既可以讀也可以寫(?a+??)。
A、 a
B、 w
C、 a+
D、 wb
答案: C
24、下列Tag對象的哪個屬性返回標(biāo)簽包含的屬性?(?attrs?? )
A、 name
B、 contents
C、 attrs
D、 string
答案: C
25、下列關(guān)于urlopen()函數(shù)的說法錯誤的是(?不設(shè)置data參數(shù)時,以POST方式發(fā)送請求?)
A、 data參數(shù)是可選的
B、 可以用于對目標(biāo)URL的訪問
C、 設(shè)置data參數(shù)時,以POST方式發(fā)送請求
D、 不設(shè)置data參數(shù)時,以POST方式發(fā)送請求
答案: D
26、下列關(guān)于Requests庫的說法錯誤的是(?是一個Python標(biāo)準(zhǔn)庫?)
A、 是一個Python標(biāo)準(zhǔn)庫
B、 能夠發(fā)送HTTP請求
C、 能夠抓取二進(jìn)制數(shù)據(jù)
D、 能夠發(fā)送HTTP請求頭
答案: A
27、下列關(guān)于lxml庫的說法正確的是(?lxml是一款高性能的HTML/XML解析庫?)
A、 lxml是一個網(wǎng)絡(luò)庫
B、 lxml是一款高性能的HTML/XML解析庫
C、 僅支持利用XPath來選取節(jié)點(diǎn)
D、 lxml是一個Python的標(biāo)準(zhǔn)庫
答案: B
28、下列關(guān)于XPath的語法說法錯誤的是(?‘//’選取當(dāng)前節(jié)點(diǎn)的子節(jié)點(diǎn))
A、 ‘/’選取當(dāng)前節(jié)點(diǎn)的直接子節(jié)點(diǎn)
B、 ‘@’選取屬性
C、 ‘..’選取父節(jié)點(diǎn)
D、 ‘//’選取當(dāng)前節(jié)點(diǎn)的子節(jié)點(diǎn)
答案: D
29、下列說法錯誤的是(?XPath不能做多屬性過濾?)
A、 ‘//*’選取整個HTML所有的節(jié)點(diǎn)
B、 ‘//li/a’選取<li>節(jié)點(diǎn)下的所有<a>節(jié)點(diǎn)
C、 XPath不能做多屬性過濾
D、 XPath中的索引是從1開始的
答案: C
30、下列關(guān)于XPath中功能函數(shù)描述錯誤的是(?contains( )方法可用于選取以指定值開頭的節(jié)點(diǎn)?)
A、 contains( )方法可用于選取以指定值開頭的節(jié)點(diǎn)
B、 and( )方法可用于選取同時包含兩種指定值的節(jié)點(diǎn)
C、 text( )函數(shù)可用于選取包含指定文本內(nèi)容的節(jié)點(diǎn)
D、 text( )函數(shù)可提取節(jié)點(diǎn)文本內(nèi)容
答案: A
31、在MySQL數(shù)據(jù)庫中,下列說法錯誤的是(?使用show database命令顯示所有數(shù)據(jù)庫?)
A、 使用show database命令顯示所有數(shù)據(jù)庫
B、 使用update命名修改數(shù)據(jù)
C、 使用delete命名刪除數(shù)據(jù)
D、 使用insert into命名插入數(shù)據(jù)
答案: A
32、下列關(guān)于Chrome 開發(fā)者工具描述錯誤的是(?網(wǎng)絡(luò)面板無法查看HTML源碼?)
A、 元素面板可查看元素在頁面的對應(yīng)位置
B、 源代碼面板可查看HTML源碼
C、 網(wǎng)絡(luò)面板無法查看HTML源碼
D、 網(wǎng)絡(luò)面板可查看HTTP頭部信息
答案: C
33、下列關(guān)于BeautifulSoup中對象類型描述錯誤的是(?attrs( )方法可獲取Tag對象的HTML屬性,返回值為列表形式? )
A、 name( )方法可以獲取及修改Tag對象名稱
B、 attrs( )方法可獲取Tag對象的HTML屬性,返回值為列表形式
C、 string( )方法可獲取Tag對象中的文本字符串內(nèi)容
D、 NavigableString對象無法被編輯,但可以進(jìn)行替換
答案: B
二、判斷題(本大題共10小題,每小題1.5分,共15分)
1、網(wǎng)站中的robots.txt可以無視。
答案: 錯誤
2、get方法相比post方法能攜帶更多信息。
答案: 錯誤
3、正則表達(dá)式中.*代表匹配任意內(nèi)容。?
答案: 正確
4、Selenium的webdriver的版本必須和瀏覽器的版本相對應(yīng)。
答案: 正確
5、Selenium中模擬鼠標(biāo)點(diǎn)擊的函數(shù)是send_keys()。
答案: 錯誤
6、requests庫中直接使用返回對象response.encoding的編碼方式解析網(wǎng)頁一定不會造成亂碼問題。
答案: 錯誤
7、requests庫中post()函數(shù)的data參數(shù)可以接收字典、字節(jié)序列或文件對象,作為請求體的內(nèi)容提交給HTTP。
答案: 正確
8、在BeautifulSoup4庫中CSS選擇器'a[src*="abc"]'表示選擇其src屬性值中包含“abc”子串的所有<a>節(jié)點(diǎn)。
答案: 正確
9、在XPath語法中'body/div[1]'表示選取body節(jié)點(diǎn)下的第二個div子節(jié)點(diǎn)。
答案: 錯誤
10、Tag對象的string屬性返回標(biāo)簽的文本信息,而text屬性返回標(biāo)簽下所有標(biāo)簽的文本信息。
答案: 正確
11、在Match對象中g(shù)roup()方法分組的下標(biāo)從1開始。
答案: 錯誤
12、在dumps()方法將python數(shù)據(jù)類型轉(zhuǎn)化成JSON字符串時,將ensure_ascii設(shè)置為True,就能正常輸出中文字符。
答案: 錯誤
13、csv庫提供DIctWriter()方法用于初始化一個字典寫入對象。
答案: 正確
14、find_elements_by_name()表示通過節(jié)點(diǎn)的name屬性名定位,匹配返回第一個符合條件的節(jié)點(diǎn)。
答案: 錯誤
15、在selenium中,通過ActionChains類初始化對象browser,這個對象會存儲所有用戶產(chǎn)生的行為,需要通過perform()方法執(zhí)行這些行為。
答案: 正確
16、對數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行了修改,需要通過游標(biāo)對象的commit()方法提交事務(wù),才會將修改后的數(shù)據(jù)真正更新到數(shù)據(jù)庫中。
答案: 正確
17、在使用代碼連接MySQL數(shù)據(jù)庫時,如果指定的數(shù)據(jù)庫還沒創(chuàng)建也可以直接連接。
答案: 錯誤
18、在MongoDB中,可以通過find()方法查詢多條記錄,返回一個字典列表數(shù)據(jù)。
答案: 正確
19、在requests庫中,可以在發(fā)送HTTP請求時,使用proxies參數(shù)添加代理IP。
答案: 正確
20、在Scrapy庫中,Spider是負(fù)責(zé)處理所有的Request,并按照一定的方式將其進(jìn)行整理。
答案: 錯誤
21、在settings.py文件中的ITEM_PIPELINES的鍵值是一個數(shù)字,數(shù)字越大優(yōu)先級越高。
答案: 錯誤
三、填空題(本大題共5小題,每小題2分,共10分)
1、HTTP響應(yīng)由(__)、(__)和(__)三部分組成。
答案: 響應(yīng)狀態(tài)碼; 響應(yīng)頭; 響應(yīng)體;
2、HTTP請求由(__)、? (__)?、? (__)和(__)?四部分組成。
答案:請求的URL; 請求方法; 請求頭; 請求體;
3、匹配"abe""ace" 和"ade"的正則表達(dá)式為(__)
答案: a[bcd]e;
4、pymongo庫使用MongoClient類連接數(shù)據(jù)庫,須指定連接的數(shù)據(jù)庫(__)和(__)。
答案: 地址; 端口;
5、表示匹配任意數(shù)字的正則表達(dá)式是(__).
答案: [0-9];\d;
6、Selenium中使用___(__)___獲取某個元素顯示在網(wǎng)頁上的文本。
答案: .text;
7、
通過BeautifulSoup的CSS選擇器soup對象定位到li節(jié)點(diǎn)? ? ? ? ? ? ? ?
答案: soup.select('#J_goodsList>ul>li');
8、使用組合的方式匹配任意非數(shù)字的正則表達(dá)式是? ? ? ? ? ? ? ? ?。
答案: [^0-9];
9、通過正則表達(dá)式提取html標(biāo)簽名稱:text = "<h1>這是標(biāo)題</h1>"是? ? ? ? ? ? ? ? ? ??。
答案:?re.search("<.+?>",text);
10、Selenium中使用_______獲取某個標(biāo)簽的其他屬性。
答案: get_atrribute();
11、使用組合方式匹配\w的正則表達(dá)式是? ? ? ? ? ? ? ? ??。
答案: [a-zA-Z0-9_];
12、通過正則表達(dá)式驗證一個字符是不是0-100之間的數(shù)字,是? ? ? ? ? ? ? ? ? ??。
答案:?0$|[1-9]\d?$|100$;
13、獲取所有l(wèi)i元素下的所有class屬性的值的XPath語句是? ? ? ? ? ? ? ? ? ?。
答案: xpath('//li/@class');
14、獲取倒數(shù)第二個li的a標(biāo)簽里內(nèi)容的XPath語句是? ? ? ? ? ? ? ??。
答案: xpath('//li[last()-1]/a')[0].text;xpath('//li[last()-1]/a/text()');
15、獲取最后一個li的a的href屬性對應(yīng)的值的XPath語句是 ? ? ? ? ? ? ? ? ? ? ??。
答案: xpath('//li[last()]/a/@href');
?
四、簡答題(本大題共5小題,每小題5分,共25分)
1、簡述網(wǎng)絡(luò)爬蟲基本工作原理。
答案:
(1)預(yù)先設(shè)定一個或若干個初始網(wǎng)頁URL,將初始URL加入到待爬取URL列表中;
(2)從待爬取列表中逐個讀取URL,并將URL加入到已爬取URL列表中,然后下載網(wǎng)頁;
(3)解析已下載的網(wǎng)頁,并存儲提取的數(shù)據(jù),從中獲取新的URL;
(4)將新的URL在已爬取的URL列表中進(jìn)行比對,檢查該網(wǎng)頁是否已爬取,如果網(wǎng)頁沒有被爬取,則將新的URL地址放入到待爬取URL列表的末尾,等待讀??;
(5)如此往復(fù),直到待爬取URL列表為空或者滿足設(shè)定的終止條件,最終達(dá)到遍歷網(wǎng)頁的目的。
2、簡述在瀏覽器中輸入一個URL按下回車鍵后瀏覽器顯示內(nèi)容的這一過程的HTTP原理。
答案:
(1)瀏覽器向Web服務(wù)器發(fā)送了一個HTTP請求;
(2)Web服務(wù)器接收請求后進(jìn)行解析和處理,返回給瀏覽器對應(yīng)的HTTP響應(yīng);
(3)瀏覽器對HTTP響應(yīng)進(jìn)行解析,將網(wǎng)頁呈現(xiàn)。
3、簡述常見的幾種反爬蟲策略。
答案:
(1)通過Headers反爬蟲通過識別用戶請求的Headers來反爬蟲
(2)基于用戶行為反爬蟲通過檢測用戶行為來判斷請求是否來自爬蟲程序
4、寫出圖片驗證碼的識別思路。
答案:
(1)獲取驗證碼圖片。
(2)將圖像轉(zhuǎn)化為灰度圖像。
(3)將灰度圖像轉(zhuǎn)化為二值圖像。
(4)使用OCR技術(shù)識別圖中字母或數(shù)字。
5、簡述點(diǎn)觸驗證碼的識別思路。
答案:
(1)獲取驗證碼圖片。
(2)獲取單擊的位置坐標(biāo)。
(3)解析坐標(biāo),模擬點(diǎn)擊。
6、簡述滑動拼圖驗證識別思路。
答案:
(1)獲取驗證碼圖片。
(2)在圖片上繪制文字。
(3)獲取滑塊移動至缺口的距離。
(4)生成滑塊移動軌跡。
(5)模擬拖動滑塊。
7、Scrapy框架由哪7個組件構(gòu)成,每個組件的有什么功能?
答案:
(1)Engine?:處理系統(tǒng)的數(shù)據(jù)流、觸發(fā)事務(wù),是整個框架的核心。
(2)Scheduler?:處理所有的Request, 并按照一定的方式將其進(jìn)行整理、排列和入隊。
(3)Downloader?:下載網(wǎng)頁內(nèi)容。
(4)Spider:解析所有的Response,提取Item所需的數(shù)據(jù)和新的URL。
(5)?Item Plpeline?:處理Item
(6)Downloader Middleware:自定義擴(kuò)展下載功能。
(7)Spider Middleware:自定義擴(kuò)展Engine和Spider間通信的功能。
8、簡述Scrapy中Engine控制數(shù)據(jù)流的工作基本步驟。
答案:
(1) Engine 從Spider獲取初始爬取列表的Request.
(2) Engine將要爬取的Request發(fā)送給Scheduler,通過Scheduler進(jìn)行調(diào)度。
(3) Engine向Scheduler獲取下一個要爬取的Request.
(4) Engine 將Request通過Downloader Middleware發(fā)送給Downloader.
(5)當(dāng)網(wǎng)頁下載完畢,Downloader 生成該網(wǎng)頁的Response,并將其通過Downloader Middleware提交給Engine.
(6) Engine 將接收到Response通過Spider Middleware發(fā)送給Spider處理。
(7) Spider 解析響應(yīng),提取Item所需的數(shù)據(jù)和新的URL,并將Item和新的Request通過Spider Middleware提交給Engine。
(8) Engine 將Item發(fā)送給Item Pipeline,將新的Request發(fā)送給Scheduler.
(9)重復(fù)第(2) ~ (8) 步,直到Scheduler中沒有Request, Engine 關(guān)閉該爬蟲程序,爬取結(jié)束。
9、簡述cookie和session會話的聯(lián)系與區(qū)別。
答案:
1、cookie數(shù)據(jù)存放在客戶的瀏覽器上,session數(shù)據(jù)放在服務(wù)器上。
2、cookie不是很安全,別人可以分析存放在本地的cookie并進(jìn)行cookie欺騙
3、session比較占用你服務(wù)器的性能
4、單個cookie保存的數(shù)據(jù)不能超過4K
10、羅列五個常見的請求頭信息。
答案:
User-Agent
Accept
Referer?cookie
Content-Type
11、簡述JSON數(shù)據(jù)的本質(zhì)與使用。
答案:
JSON的本質(zhì):是一個字符串,JSON是對JS對象的字符串表達(dá)式,它使用文本形式表示一個JS對象的信息。
JSON使用:
(1)json.dumps,將Python的list或者dict返回為一個JSON字符串;
(2)json.loads,將JSON字符串返回為Python的list或者dict;
(3)json.dump,將Python的list或者dict轉(zhuǎn)為一個JSON字符串,保存到文件中;
(4)json.load?,從JSON文件中讀出JSON數(shù)據(jù),并轉(zhuǎn)換為Python的list或者dict。
?
12、簡述下在?requests 模塊中,requests.content 和?requests.text 什么區(qū)別。
答案:
requests.text返回的是unicode型數(shù)據(jù),requsets.content返回的是bytes(二進(jìn)制)型數(shù)據(jù)
13、簡述下通用爬蟲工作流程。
答案:
工作流程可以分為爬取網(wǎng)頁、解析網(wǎng)頁和存儲數(shù)據(jù)三個步驟。
14、解釋一下一個URL由幾個部分組成:scheme://host:port/path/?query-string=xxx#anchor
答案:
URL:是對可以從互聯(lián)網(wǎng)上得到的資源位置和訪問方法的一種簡潔表示,是互聯(lián)網(wǎng)上標(biāo)準(zhǔn)資源的地址。
scheme:協(xié)議
host/IP:服務(wù)器的IP地址或者域名
port:服務(wù)器的端口
path:訪問資源的路徑
query-string:參數(shù),發(fā)送給http服務(wù)器的數(shù)據(jù)
anchor:錨
15、request請求方式中的post、get有什么區(qū)別
答案:
GET一般用于獲取/查詢資源信息,而POST一般用于更新資源信息;
get安全性非常低,post安全性較高,但是get執(zhí)行效率卻比Post方法好
16、簡述使用Scrapy框架的一般流程。
答案:
1.創(chuàng)建新項目;2.修改items腳本,定義Item中數(shù)據(jù)的結(jié)構(gòu);3.創(chuàng)建spider腳本,解析響應(yīng),提取數(shù)據(jù)和新的URL;4.修改settings.py腳本,設(shè)置Scrapy組件和定義全局變量;5.運(yùn)行爬蟲程序。
五、編程題(本大題共2小題,每小題10分,共20分)
1、
編寫一個python程序,參考附錄中的內(nèi)容,使用python中的selenium模塊完成以下內(nèi)容: ? a. ? 打開谷歌瀏覽器 ? b. ? 訪問百度首頁 ? c. ? 在百度首頁的文本輸入框中輸入“泉州職業(yè)技術(shù)大學(xué)” ? d. ? 點(diǎn)擊“百度一下”按鈕 附錄1:百度首頁中輸入框?qū)?yīng)的html代碼 `<input id="kw" name="wd" value="" maxlength="255" autocomplete="off">` 附錄2:百度首頁中“百度以下”按鈕對應(yīng)的html代碼 `<input type="submit" id="su" value="百度一下" class="bg s_btn">`
答案:
from selenium import webdriver
Browser = webdriver.Chrom()
Browser.get(“https://www.baidu.com”)
Browser.find_element_by_id(‘kw’).send_keys(“泉州職業(yè)技術(shù)大學(xué)”)
Browser.find_element_by_id(‘su’).click()
?
2、使用Selenium模擬瀏覽器訪問淘寶首頁(網(wǎng)址https://www.taobao.com/),通過selenium庫提供的常用方法定位節(jié)點(diǎn),輸出爬取到的節(jié)點(diǎn)和節(jié)點(diǎn)信息。
附錄:
<input id="q" name="q" aria-label="請輸入搜索文字" accesskey="s" autofocus="true" autocomplete="off" aria-haspopup="true" aria-combobox="list" role="combobox" x-webkit-grammar="builtin:translate">
?
答案:
from selenium import webdriver??????? #導(dǎo)入webdriver模塊
#初始化Google Chrome瀏覽器對象,并賦值給browser
browser = webdriver.Chrome()
#請求淘寶首頁,打開一個瀏覽器窗口
browser.get('https://www.taobao.com/')
#輸出id屬性值為“q”的節(jié)點(diǎn)
print('通過id屬性值“q”定位節(jié)點(diǎn):')
print(browser.find_element_by_id('q'))
#輸出class屬性值為“btn-search”的節(jié)點(diǎn)
print('通過class屬性值“btn-search”定位節(jié)點(diǎn):')
print(browser.find_element_by_class_name('btn-search'))
#輸出使用XPath定位的id屬性值為“q”的節(jié)點(diǎn)
print('通過XPath定位id屬性值為“q”的節(jié)點(diǎn):')
print(browser.find_element_by_xpath('//input[@id="q"]'))
#輸出使用CSS選擇器定位的class屬性值為“btn-search”的節(jié)點(diǎn)
print('通過CSS選擇器定位class屬性值為“btn-search”的節(jié)點(diǎn):')
print(browser.find_element_by_css_selector('.btn-search'))
#定位class屬性值為“btn-search”的節(jié)點(diǎn),并賦值給element
element = browser.find_element_by_class_name('btn-search')
#輸出element的type屬性值
print('class屬性值為“btn-search”節(jié)點(diǎn)的type屬性值:', element.get_attribute("type"))
#輸出element的文本
print('class屬性值為“btn-search”節(jié)點(diǎn)的文本:', element.text)
#輸出element的節(jié)點(diǎn)名
print('class屬性值為“btn-search”節(jié)點(diǎn)的節(jié)點(diǎn)名:', element.tag_name)
#輸出element的id
print('class屬性值為“btn-search”節(jié)點(diǎn)的id:', element.id)
?
3、爬取Python中文開發(fā)者社區(qū)的Python高級教程網(wǎng)頁(網(wǎng)址https://www.pythontab.com/html/pythonhexinbiancheng/),輸出所有頁面的URL、響應(yīng)狀態(tài)碼和請求頭。(總共有27頁,從第2頁開始每翻一頁url變成https://www.pythontab.com/html/pythonhexinbiancheng/2.html,以此類推至https://www.pythontab.com/html/pythonhexinbiancheng/27.html)
附錄:
headersvalue = {
??? 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'
}?? #設(shè)置請求頭的User-Agent信息
#定義代理IP
proxy = {'http': 'http://121.232.148.167:9000'}
?
答案:
import time??????????????????? #導(dǎo)入time模塊
import random??????????????????#導(dǎo)入random模塊
import requests????????????????? #導(dǎo)入requests模塊
#定義base_url字符串
base_url='https://www.pythontab.com/html/pythonhexinbiancheng/'
headersvalue = {
??? 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'
}?? #設(shè)置請求頭的User-Agent信息
#定義代理IP
proxy = {'http': 'http://121.232.148.167:9000'}
for i in range(1,28):??????????????? #循環(huán)
??? if i>1:
??????? url = base_url+str(i)+'.html'#組合網(wǎng)頁URL
??? else:
??????? url = base_url??????????? #第一頁URL
??? print(url)??????????????????????????????????? #輸出每個頁面的URL
??? #異常判斷
??? try:
??????? #設(shè)置代理IP,發(fā)送HTTP請求
??????? r=requests.get(url,headers=headersvalue,proxies=proxy)
??? except:
??????? print('請求失敗')???? #請求錯誤,輸出“請求失敗”
??? else:
??????? print(r.status_code)?????? #輸出響應(yīng)狀態(tài)碼
??????? print(r.request.headers)?#輸出請求頭
??? #設(shè)置隨機(jī)休眠時間
????sleep_time = random.randint(0, 2) + random.random()
??? time.sleep(sleep_time)?????????#程序休眠sleep_time
?