Python常問的100個(gè)面試問題匯總(下篇)
前言
如果你在尋找python工作,那你的面試可能會(huì)涉及Python相關(guān)的問題。
通過對(duì)網(wǎng)絡(luò)資料的收集整理,本文列出了100道python的面試題以及答案,你可以根據(jù)需求閱讀測(cè)試。
Q51.請(qǐng)解釋使用args和kwargs的含義
當(dāng)我們不知道向函數(shù)傳遞多少參數(shù)時(shí),比如我們向傳遞一個(gè)列表或元組,我們就使用*args:
def func(*args): for i in args: print(i) func(3,2,1,4,7) 3 2 1 4 7
在我們不知道該傳遞多少關(guān)鍵字參數(shù)時(shí),使用**kwargs來收集關(guān)鍵字參數(shù):
def func(**kwargs): for i in kwargs: print(i,kwargs[i]) func(a=1,b=2,c=7) a.1 b.2 c.7
Q52.如何在Python中刪除文件?
使用命令os.remove(filename)或os.unlink(filename)
Q53.解釋如何從C訪問用Python編寫的模塊?
您可以通過以下方法訪問C中用Python編寫的模塊:
Module = = PyImport_ImportModule(“<modulename>”)
Q54.在Python中使用//運(yùn)算符?
它是一個(gè)Floor Divisionoperator,用于分割兩個(gè)操作數(shù),結(jié)果為商,只顯示小數(shù)點(diǎn)前的數(shù)字。
例如,10 // 5 = 2和10.0 // 5.0 = 2.0。
Q55.怎么移除一個(gè)字符串中的前導(dǎo)空格?
字符串中的前導(dǎo)空格就是出現(xiàn)在字符串中第一個(gè)非空格字符前的空格。
我們使用方法Istrip()可以將它從字符串中移除。
’ Data123 '.lstrip()
結(jié)果:
'Data123 ’
最初的字符串當(dāng)中既有前導(dǎo)字符也有后綴字符,調(diào)用Istrip()去除了前導(dǎo)空格,如果我們想去除后綴空格,可以使用rstrip()方法。
'Data123 '.rstrip() 'Data123'
Q56.如何用Python輸出一個(gè)Fibonacci數(shù)列?
a,b = 0, 1 while b<100: print (b) a, b = b, a+b
Q57.在Python中怎樣將字符串轉(zhuǎn)換為整型變量?
如果字符串只含有數(shù)字字符,可以用函數(shù)int()將其轉(zhuǎn)換為整數(shù)。
int(‘22’)
我們檢查一下變量類型:
type('22') <class'str'> type(int('22')) <class'int'>
Q58.在Python中如何生成一個(gè)隨機(jī)數(shù)?
要想生成隨機(jī)數(shù),我們可以從random模塊中導(dǎo)入函數(shù)random()。
from random import random random() 0.013501571090371978
我們還可以使用函數(shù)randint(),它會(huì)用兩個(gè)參數(shù)表示一個(gè)區(qū)間,返回該區(qū)間內(nèi)的一個(gè)隨機(jī)整數(shù)。
from random import randint randint(2,7) 4
Q59.怎樣將字符串中第一個(gè)字母大寫?
最簡(jiǎn)單的方法就是用capitalize()方法。
'daxie'.capitalize() 'Daxie'
Q60.如何檢查字符串中所有的字符都為字母數(shù)字?
對(duì)于這個(gè)問題,我們可以使用isalnum()方法。
'DATA123'.isalnum() True 'DATA123!'.isalnum() False
我們還可以用其它一些方法:
'123'.isdigit()#檢測(cè)字符串是否只由數(shù)字組成 True '123'.isnumeric()#只針對(duì)unicode對(duì)象 True 'data'.islower()#是否都為小寫 True 'Data'.isupper()#是否都為大寫 False
Q61.什么是Python中的連接(concatenation)?
Python中的連接就是將兩個(gè)序列連在一起,我們使用+運(yùn)算符完成:
'22'+'33' ‘2233' [1,2,3]+[4,5,6] [1, 2,3, 4, 5, 6] (2,3)+(4) TypeError Traceback (most recent call last) <ipython-input-7-69a1660f2fc5> in <module> ----> 1 (2,3)+(4) TypeError: can only concatenate tuple (not "int") to tuple
這里運(yùn)行出錯(cuò),因?yàn)椋?)被看作是一個(gè)整數(shù),修改一下再重新運(yùn)行:
(2,3)+(4,) (2, 3,4)
Q62.什么是遞歸?
在調(diào)用一個(gè)函數(shù)的過程中,直接或間接地調(diào)用了函數(shù)本身這個(gè)就叫遞歸。但為了避免出現(xiàn)死循環(huán),必須要有一個(gè)結(jié)束條件,舉個(gè)例子:
def facto(n): if n==1: return 1 return n*facto(n-1) facto(5) 120
Q63.什么是生成器?
生成器會(huì)生成一系列的值用于迭代,這樣看它又是一種可迭代對(duì)象。
它是在for循環(huán)的過程中不斷計(jì)算出下一個(gè)元素,并在適當(dāng)?shù)臈l件結(jié)束for循環(huán)。
我們定義一個(gè)能逐個(gè)“yield”值的函數(shù),然后用一個(gè)for循環(huán)來迭代它。
def squares(n): i=1 while(i<=n): yield i**2 i+=1 for i in squares(5): print(i) 1 4 9 16 25
Q64.什么是迭代器?
迭代器是訪問集合元素的一種方式。
迭代器對(duì)象從集合的第一個(gè)元素開始訪問,直到所有的元素被訪問完結(jié)束。
迭代器只能往前不會(huì)后退。我們使用inter()函數(shù)創(chuàng)建迭代器。
odds=iter([1,2,3,4,5]) #每次想獲取一個(gè)對(duì)象時(shí),我們就調(diào)用next()函數(shù) next (odds) 1 next (odds) 2 next (odds) 3 next (odds) 4 next (odds) 5
Q65.請(qǐng)說說生成器和迭代器之間的區(qū)別
1)在使用生成器時(shí),我們創(chuàng)建一個(gè)函數(shù);在使用迭代器時(shí),我們使用內(nèi)置函數(shù)iter()和next();
2)在生成器中,我們使用關(guān)鍵字‘yield’來每次生成/返回一個(gè)對(duì)象;
3)生成器中有多少‘yield’語句,你可以自定義;
4)每次‘yield’暫停循環(huán)時(shí),生成器會(huì)保存本地變量的狀態(tài)。而迭代器并不會(huì)使用局部變量,它只需要一個(gè)可迭代對(duì)象進(jìn)行迭代;
5)使用類可以實(shí)現(xiàn)你自己的迭代器,但無法實(shí)現(xiàn)生成器;
6)生成器運(yùn)行速度快,語法簡(jiǎn)潔,更簡(jiǎn)單;
7)迭代器更能節(jié)約內(nèi)存。
Q66.函數(shù)zip()的是干嘛的?
Python新手可能對(duì)這個(gè)函數(shù)不是很熟悉,zip()可以返回元組的迭代器。
list(zip([‘a’,‘b’,‘c’],[1,2,3]))
[(‘a’,1), (‘b’, 2), (‘c’, 3)]
在這里zip()函數(shù)對(duì)兩個(gè)列表中的數(shù)據(jù)項(xiàng)進(jìn)行了配對(duì),并用它們創(chuàng)建了元組。
Q67.如何用Python找出你目前在哪個(gè)目錄?
我們可以使用函數(shù)/方法getcwd(),從模塊os中將其導(dǎo)入。
import os
os.getcwd()
‘C:\Users\37410\Desktop\代碼’
Q68.如何計(jì)算一個(gè)字符串的長(zhǎng)度?
這個(gè)也比較簡(jiǎn)單,在我們想計(jì)算長(zhǎng)度的字符串上調(diào)用函數(shù)len()即可。
len(‘Data 123’)
8
Q69.如何從列表中刪除最后一個(gè)對(duì)象?
從列表中刪除并返回最后一個(gè)對(duì)象或obj。
list.pop(obj = list [-1])
Q70.解釋一些在Python中實(shí)現(xiàn)面向功能的編程的方法
有時(shí),當(dāng)我們想要遍歷列表時(shí),一些方法會(huì)派上用場(chǎng)。
1)filter()
過濾器允許我們根據(jù)條件邏輯過濾一些值。
list(filter(lambda x:x> 5,range(8))) [6,7] 2)map()
Map將函數(shù)應(yīng)用于iterable中的每個(gè)元素。
list(map(lambda x:x ** 2,range(8))) [0,1,4,9,16,25,36,49] 3)reduce()
在我們達(dá)到單個(gè)值之前,Reduce會(huì)反復(fù)減少序列順序。
from functools import reduce reduce(lambda x,y:xy,[1,2,3,4,5]) -13
Q71.編寫一個(gè)Python程序來計(jì)算數(shù)字列表的總和
def list_sum(num_List):如果len(num_List)== 1: return num_List [0] else: return num_List [0] + list_sum(num_List [1:]) print(list_sum([3,4,5,6,11])) 29
Q72.編寫一個(gè)Python程序來讀取文件中的隨機(jī)行
import random def random_line(fname): lines = open(fname).read().splitlines() return random.choice(lines) print(random_line('test.txt'))
Q73.編寫一個(gè)Python程序來計(jì)算文本文件中的行數(shù)
def file_lengthy(fname): open(fname)as f: for i,l in enumerate(f): pass return i + 1 print(“file of lines:”,file_lengthy(“test.txt”))
Q74.請(qǐng)寫一個(gè)Python邏輯,計(jì)算一個(gè)文件中的大寫字母數(shù)量
import os os.chdir('C:\Users\lifei\Desktop') with open('Today.txt') as today: count=0 for i in today.read(): if i.isupper(): count+=1 print(count)
Q75.在Python中為數(shù)值數(shù)據(jù)集編寫排序算法
以下代碼可用于在Python中對(duì)列表進(jìn)行排序:
list = ["1", "4", "0", "6", "9"] list = [int(i) for i in list] list.sort() print (list) Django有關(guān)
Q76.請(qǐng)解釋或描述一下Django的架構(gòu)
對(duì)于Django框架遵循MVC設(shè)計(jì),并且有一個(gè)專有名詞:MVT,
M全拼為Model,與MVC中的M功能相同,負(fù)責(zé)數(shù)據(jù)處理,內(nèi)嵌了ORM框架;
V全拼為View,與MVC中的C功能相同,接收HttpRequest,業(yè)務(wù)處理,返回HttpResponse;
T全拼為Template,與MVC中的V功能相同,負(fù)責(zé)封裝構(gòu)造要返回的html,內(nèi)嵌了模板引擎
Q77.Django,Pyramid和Flask之間的差異
Flask是一個(gè)“微框架”,主要用于具有更簡(jiǎn)單要求的小型應(yīng)用程序。
Pyramid適用于大型應(yīng)用程序,具有靈活性,允許開發(fā)人員為他們的項(xiàng)目使用數(shù)據(jù)庫,URL結(jié)構(gòu),模板樣式等正確的工具。
Django也可以像Pyramid一樣用于更大的應(yīng)用程序。它包括一個(gè)ORM。
Q78.討論Django架構(gòu)
Django架構(gòu)
開發(fā)人員提供模型,視圖和模板,然后將其映射到URL,Django可以為用戶提供服務(wù)。
Q79.解釋如何在Django中設(shè)置數(shù)據(jù)庫
Django使用SQLite作為默認(rèn)數(shù)據(jù)庫,它將數(shù)據(jù)作為單個(gè)文件存儲(chǔ)在文件系統(tǒng)中。
如過你有數(shù)據(jù)庫服務(wù)器-PostgreSQL,MySQL,Oracle,MSSQL-并且想要使用它而不是SQLite,那么使用數(shù)據(jù)庫的管理工具為你的Django項(xiàng)目創(chuàng)建一個(gè)新的數(shù)據(jù)庫。
無論哪種方式,在您的(空)數(shù)據(jù)庫到位的情況下,剩下的就是告訴Django如何使用它。
這是項(xiàng)目的settings.py文件的來源。
我們將以下代碼行添加到setting.py文件中:
DATABASES ={‘default’: {‘ENGINE’: ‘django.db.backends.sqlite3’, ‘NAME’: os.path.join(BASE_DIR, ‘db.sqlite3’),
Q80.舉例說明如何在Django中編寫VIEW?
這是我們?cè)贒jango中使用write一個(gè)視圖的方法:
from django.http import HttpResponse import datetime def Current_datetime(request): now =datetime.datetime.now() html ="<html><body>It is now %s</body></html>"%now return HttpResponse(html)
返回當(dāng)前日期和時(shí)間,作為HTML文檔。
Q81.提到Django模板的組成部分。
模板是一個(gè)簡(jiǎn)單的文本文件。
它可以創(chuàng)建任何基于文本的格式,如XML,CSV,HTML等。
模板包含在評(píng)估模板時(shí)替換為值的變量和控制模板邏輯的標(biāo)記(%tag%)。
Q82.在Django框架中解釋會(huì)話的使用?
Django提供的會(huì)話允許您基于每個(gè)站點(diǎn)訪問者存儲(chǔ)和檢索數(shù)據(jù)。
Django通過在客戶端放置會(huì)話ID cookie并在服務(wù)器端存儲(chǔ)所有相關(guān)數(shù)據(jù)來抽象發(fā)送和接收cookie的過程。
所以數(shù)據(jù)本身并不存儲(chǔ)在客戶端。
從安全角度來看,這很好。
Q83.列出Django中的繼承樣式
在Django中,有三種可能的繼承樣式:
抽象基類:當(dāng)你只希望父類包含而你不想為每個(gè)子模型鍵入的信息時(shí)使用;
多表繼承:對(duì)現(xiàn)有模型進(jìn)行子類化,并且需要每個(gè)模型都有自己的數(shù)據(jù)庫表。
代理模型:只想修改模型的Python級(jí)別行為,而無需更改模型的字段。
數(shù)據(jù)分析
Q84.什么是Python中的map函數(shù)?
map函數(shù)執(zhí)行作為第一個(gè)參數(shù)給出的函數(shù),該函數(shù)作為第二個(gè)參數(shù)給出的iterable的所有元素。
如果給定的函數(shù)接受多于1個(gè)參數(shù),則給出了許多迭代。
Q85.如何在NumPy數(shù)組中獲得N個(gè)最大值的索引?
我們可以使用下面的代碼在NumPy數(shù)組中獲得N個(gè)最大值的索引:
importnumpy as np arr =np.array([1, 3, 2, 4, 5]) print(arr.argsort()[-3:][::-1]) 4 3 1
Q86.如何用Python/ NumPy計(jì)算百分位數(shù)?
importnumpy as np a =np.array([1,2,3,4,5] p =np.percentile(a, 50) #Returns 50th percentile, e.g. median print(p) 3
Q87.NumPy陣列在(嵌套)Python列表中提供了哪些優(yōu)勢(shì)?
1)Python的列表是高效的通用容器。
它們支持(相當(dāng))有效的插入,刪除,追加和連接,Python的列表推導(dǎo)使它們易于構(gòu)造和操作。
2)有一定的局限性
它們不支持元素化加法和乘法等“向量化”操作,可以包含不同類型的對(duì)象這一事實(shí)意味著Python必須存儲(chǔ)每個(gè)元素的類型信息,并且必須在操作時(shí)執(zhí)行類型調(diào)度代碼在每個(gè)元素上。
3)NumPy不僅效率更高,也更方便
你可以獲得大量的矢量和矩陣運(yùn)算,這有時(shí)可以避免不必要的工作。
4)NumPy數(shù)組更快
你可以使用NumPy,F(xiàn)FT,卷積,快速搜索,基本統(tǒng)計(jì),線性代數(shù),直方圖等內(nèi)置。
Q88.解釋裝飾器的用法
Python中的裝飾器用于修改或注入函數(shù)或類中的代碼。
使用裝飾器,您可以包裝類或函數(shù)方法調(diào)用,以便在執(zhí)行原始代碼之前或之后執(zhí)行一段代碼。
裝飾器可用于檢查權(quán)限,修改或跟蹤傳遞給方法的參數(shù),將調(diào)用記錄到特定方法等
Q89.NumPy和SciPy有什么區(qū)別?
1)在理想的世界中,NumPy只包含數(shù)組數(shù)據(jù)類型和最基本的操作:索引,排序,重新整形,基本元素函數(shù)等。
2)所有數(shù)字代碼都將駐留在SciPy中。然而,NumPy的一個(gè)重要目標(biāo)是兼容性,因此NumPy試圖保留其前任任何一個(gè)支持的所有功能。
3)因此,NumPy包含一些線性代數(shù)函數(shù),即使它們更恰當(dāng)?shù)貙儆赟ciPy。無論如何,SciPy包含更多全功能的線性代數(shù)模塊版本,以及許多其他數(shù)值算法。
4)如果你使用python進(jìn)行科學(xué)計(jì)算,你應(yīng)該安裝NumPy和SciPy。大多數(shù)新功能屬于SciPy而非NumPy。
Q90.如何使用NumPy / SciPy制作3D繪圖/可視化?
與2D繪圖一樣,3D圖形超出了NumPy和SciPy的范圍,但就像2D情況一樣,存在與NumPy集成的包。
Matplotlib在mplot3d子包中提供基本的3D繪圖,而Mayavi使用功能強(qiáng)大的VTK引擎提供各種高質(zhì)量的3D可視化功能。
爬蟲和scary框架
Q91.scrapy和scrapy-redis有什么區(qū)別?為什么選擇redis數(shù)據(jù)庫?
scrapy是一個(gè)Python爬蟲框架,爬取效率極高,具有高度定制性,但是不支持分布式。
而scrapy-redis一套基于redis數(shù)據(jù)庫、運(yùn)行在scrapy框架之上的組件,可以讓scrapy支持分布式策略,Slaver端共享Master端redis數(shù)據(jù)庫里的item隊(duì)列、請(qǐng)求隊(duì)列和請(qǐng)求指紋集合。
因?yàn)閞edis支持主從同步,而且數(shù)據(jù)都是緩存在內(nèi)存中的,所以基于redis的分布式爬蟲,對(duì)請(qǐng)求和數(shù)據(jù)的高頻讀取效率非常高。
Q92.你用過的爬蟲框架或者模塊有哪些?
Python自帶:urllib,urllib2
第 三 方:requests
框 架:Scrapy
urllib和urllib2模塊都做與請(qǐng)求URL相關(guān)的操作,但他們提供不同的功能。
urllib2.:urllib2.urlopen可以接受一個(gè)Request對(duì)象或者url,(在接受Request對(duì)象時(shí)候,并以此可以來設(shè)置一個(gè)URL 的headers),urllib.urlopen只接收一個(gè)url
urllib 有urlencode,urllib2沒有,因此總是urllib,urllib2常會(huì)一起使用的原因
scrapy是封裝起來的框架,他包含了下載器,解析器,日志及異常處理,基于多線程,。
twisted的方式處理,對(duì)于固定單個(gè)網(wǎng)站的爬取開發(fā),有優(yōu)勢(shì);但是對(duì)于多網(wǎng)站爬取 100個(gè)網(wǎng)站,并發(fā)及分布式處理方面,不夠靈活,不便調(diào)整與括展。
request 是一個(gè)HTTP庫, 它只是用來,進(jìn)行請(qǐng)求,對(duì)于HTTP請(qǐng)求,他是一個(gè)強(qiáng)大的庫,下載,解析全部自己處理,靈活性更高,高并發(fā)與分布式部署也非常靈活,對(duì)于功能可以更好實(shí)現(xiàn)。
Q93.你常用的mysql引擎有哪些?各引擎間有什么區(qū)別?
主要 MyISAM 與 InnoDB 兩個(gè)引擎,其主要區(qū)別如下:
1)InnoDB 支持事務(wù),MyISAM 不支持,這一點(diǎn)是非常之重要。事務(wù)是一種高
級(jí)的處理方式,如在一些列增刪改中只要哪個(gè)出錯(cuò)還可以回滾還原,而 MyISAM就不可以了;
2)MyISAM 適合查詢以及插入為主的應(yīng)用,InnoDB 適合頻繁修改以及涉及到安全性較高的應(yīng)用;
3)InnoDB 支持外鍵,MyISAM 不支持;
4)MyISAM 是默認(rèn)引擎,InnoDB 需要指定;
5)InnoDB 不支持 FULLTEXT 類型的索引;
6)InnoDB 中不保存表的行數(shù),如 select count(*) from table 時(shí),InnoDB;
需要掃描一遍整個(gè)表來計(jì)算有多少行,但是 MyISAM 只要簡(jiǎn)單的讀出保存好的行數(shù)即可。
注意的是,當(dāng) count(*)語句包含 where 條件時(shí) MyISAM 也需要掃描整個(gè)表;
7)對(duì)于自增長(zhǎng)的字段,InnoDB 中必須包含只有該字段的索引,但是在 MyISAM表中可以和其他字段一起建立聯(lián)合索引;
8)清空整個(gè)表時(shí),InnoDB 是一行一行的刪除,效率非常慢。MyISAM 則會(huì)重建表;
9)InnoDB 支持行鎖(某些情況下還是鎖整表,如 update table set a=1 whereuser like ‘%lee%’
Q94.描述下scrapy框架運(yùn)行的機(jī)制?
從start_urls里獲取第一批url并發(fā)送請(qǐng)求,請(qǐng)求由引擎交給調(diào)度器入請(qǐng)求隊(duì)列,獲取完畢后,
調(diào)度器將請(qǐng)求隊(duì)列里的請(qǐng)求交給下載器去獲取請(qǐng)求對(duì)應(yīng)的響應(yīng)資源,并將響應(yīng)交給自己編寫的解析方法做提取處理:
如果提取出需要的數(shù)據(jù),則交給管道文件處理;
2)如果提取出url,則繼續(xù)執(zhí)行之前的步驟(發(fā)送url請(qǐng)求,并由引擎將請(qǐng)求交給調(diào)度器入隊(duì)列…),直到請(qǐng)求隊(duì)列里沒有請(qǐng)求,程序結(jié)束。
Q95.什么是關(guān)聯(lián)查詢,有哪些?
將多個(gè)表聯(lián)合起來進(jìn)行查詢,主要有內(nèi)連接、左連接、右連接、全連接(外連接)
Q96.寫爬蟲是用多進(jìn)程好?還是多線程好? 為什么?
IO密集型代碼(文件處理、網(wǎng)絡(luò)爬蟲等),多線程能夠有效提升效率(單線程下有IO操作會(huì)進(jìn)行IO等待,造成不必要的時(shí)間浪費(fèi),
而開啟多線程能在線程A等待時(shí),自動(dòng)切換到線程B,可以不浪費(fèi)CPU的資源,從而能提升程序執(zhí)行效率)。
在實(shí)際的數(shù)據(jù)采集過程中,既考慮網(wǎng)速和響應(yīng)的問題,也需要考慮自身機(jī)器的硬件情況來設(shè)置多進(jìn)程或多線程。
Q97.數(shù)據(jù)庫的優(yōu)化?
1)優(yōu)化索引、SQL 語句、分析慢查詢;
2)優(yōu)化硬件;采用SSD,使用磁盤隊(duì)列技術(shù)(RAID0,RAID1,RDID5)等;
3)采用MySQL 內(nèi)部自帶的表分區(qū)技術(shù),把數(shù)據(jù)分層不同的文件,能夠提高磁盤的讀取效率;
4)選擇合適的表引擎,參數(shù)上的優(yōu)化;
5)進(jìn)行架構(gòu)級(jí)別的緩存,靜態(tài)化和分布式;
6)采用更快的存儲(chǔ)方式,例如 NoSQL存儲(chǔ)經(jīng)常訪問的數(shù)據(jù)
Q98.分布式爬蟲主要解決什么問題?
1)ip
2)帶寬
3)cpu
4)io
Q99.爬蟲過程中驗(yàn)證碼怎么處理?
1)scrapy自帶
2)付費(fèi)接口
Q100.常見的反爬蟲和應(yīng)對(duì)方法?
1)通過Headers反爬蟲從用戶請(qǐng)求的Headers反爬蟲是最常見的反爬蟲策略。
可以直接在爬蟲中添加Headers,將瀏覽器的User-Agent復(fù)制到爬蟲的Headers中;或者將Referer值修改為目標(biāo)網(wǎng)站域名。
2)基于用戶行為反爬蟲
通過檢測(cè)用戶行為,例如同一IP短時(shí)間內(nèi)多次訪問同一頁面,或者同一賬戶短時(shí)間內(nèi)多次進(jìn)行相同操作。
大多數(shù)網(wǎng)站都是前一種情況,對(duì)于這種情況,使用IP代理就可以解決。
可以專門寫一個(gè)爬蟲,爬取網(wǎng)上公開的代理ip,檢測(cè)后全部保存起來。
有了大量代理ip后可以每請(qǐng)求幾次更換一個(gè)ip,這在requests或者urllib2中很容易做到,這樣就能很容易的繞過第一種反爬蟲。
對(duì)于第二種情況,可以在每次請(qǐng)求后隨機(jī)間隔幾秒再進(jìn)行下一次請(qǐng)求。
有些有邏輯漏洞的網(wǎng)站,可以通過請(qǐng)求幾次,退出登錄,重新登錄,繼續(xù)請(qǐng)求來繞過同一賬號(hào)短時(shí)間內(nèi)不能多次進(jìn)行相同請(qǐng)求的限制。
3)動(dòng)態(tài)頁面的反爬蟲
首先用Fiddler對(duì)網(wǎng)絡(luò)請(qǐng)求進(jìn)行分析,如果能夠找到ajax請(qǐng)求,也能分析出具體的參數(shù)和響應(yīng)的具體含義,我們就能采用上面的方法。
直接利用requests或者urllib2模擬ajax請(qǐng)求,對(duì)響應(yīng)的json進(jìn)行分析得到需要的數(shù)據(jù)。
但是有些網(wǎng)站把a(bǔ)jax請(qǐng)求的所有參數(shù)全部加密了,沒辦法構(gòu)造自己所需要的數(shù)據(jù)的請(qǐng)求。
這種情況下就用selenium+phantomJS,調(diào)用瀏覽器內(nèi)核,并利用phantomJS執(zhí)行js來模擬人為操作以及觸發(fā)頁面中的js腳本。
最后
今天的分享到這里就結(jié)束了,希望這篇面試題目對(duì)你有幫助,祝你面試順利。
請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python Threading 線程/互斥鎖/死鎖/GIL鎖
這篇文章主要介紹了Python Threading 線程/互斥鎖/死鎖/GIL鎖的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07Python統(tǒng)計(jì)某列不同值的個(gè)數(shù)的示例代碼
在數(shù)據(jù)分析和數(shù)據(jù)處理中,統(tǒng)計(jì)數(shù)據(jù)往往集中在特定列中不同值的出現(xiàn)次數(shù),本文主要介紹了Python統(tǒng)計(jì)某列不同值的個(gè)數(shù)的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03基于python實(shí)現(xiàn)分析識(shí)別文章/內(nèi)容中的高頻詞和關(guān)鍵詞
要分析一篇文章的高頻詞和關(guān)鍵詞,可以使用 Python 中的 nltk 庫和 collections 庫或者jieba庫來實(shí)現(xiàn),本篇文章介紹基于兩種庫分別實(shí)現(xiàn)分析內(nèi)容中的高頻詞和關(guān)鍵詞,需要的朋友可以參考下2023-09-09Python實(shí)現(xiàn)對(duì)二維碼數(shù)據(jù)進(jìn)行壓縮
當(dāng)前二維碼的應(yīng)用越來越廣泛,包括疫情時(shí)期的健康碼也是應(yīng)用二維碼的典型案例。本文的目標(biāo)很明確,就是使用python,實(shí)現(xiàn)一張二維碼顯示更多信息,代碼簡(jiǎn)單實(shí)用,感興趣的可以了解一下2023-02-02最新PyCharm從安裝到PyCharm永久激活再到PyCharm官方中文漢化詳細(xì)教程
這篇文章涵蓋了最新版PyCharm安裝教程,最新版PyCharm永久激活碼教程,PyCharm官方中文(漢化)版安裝教程圖文并茂非常詳細(xì),需要的朋友可以參考下2020-11-11