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