溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python常問(wèn)的面試題有哪些

發(fā)布時(shí)間:2023-01-17 09:17:27 來(lái)源:億速云 閱讀:128 作者:iii 欄目:開(kāi)發(fā)技術(shù)

今天小編給大家分享一下Python常問(wèn)的面試題有哪些的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。

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來(lái)收集關(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訪問(wèn)用Python編寫(xiě)的模塊?

您可以通過(guò)以下方法訪問(wèn)C中用Python編寫(xiě)的模塊:

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()可以將它從字符串中移除。

&rsquo; Data123 '.lstrip()

結(jié)果:

'Data123 &rsquo;

最初的字符串當(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(&lsquo;22&rsquo;)

我們檢查一下變量類(lèi)型:

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è)字母大寫(xiě)?

最簡(jiǎn)單的方法就是用capitalize()方法。

'daxie'.capitalize()

'Daxie'

Q60.如何檢查字符串中所有的字符都為字母數(shù)字?

對(duì)于這個(gè)問(wèn)題,我們可以使用isalnum()方法。

'DATA123'.isalnum()

True

'DATA123!'.isalnum()

False

我們還可以用其它一些方法:

'123'.isdigit()#檢測(cè)字符串是否只由數(shù)字組成

True

'123'.isnumeric()#只針對(duì)unicode對(duì)象

True

'data'.islower()#是否都為小寫(xiě)

True

'Data'.isupper()#是否都為大寫(xiě)

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ù)的過(guò)程中,直接或間接地調(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)的過(guò)程中不斷計(jì)算出下一個(gè)元素,并在適當(dāng)?shù)臈l件結(jié)束for循環(huán)。

我們定義一個(gè)能逐個(gè)“yield”值的函數(shù),然后用一個(gè)for循環(huán)來(lái)迭代它。

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.什么是迭代器?

迭代器是訪問(wèn)集合元素的一種方式。

迭代器對(duì)象從集合的第一個(gè)元素開(kāi)始訪問(wèn),直到所有的元素被訪問(wèn)完結(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)說(shuō)說(shuō)生成器和迭代器之間的區(qū)別

1)在使用生成器時(shí),我們創(chuàng)建一個(gè)函數(shù);在使用迭代器時(shí),我們使用內(nèi)置函數(shù)iter()和next();

2)在生成器中,我們使用關(guān)鍵字&lsquo;yield&rsquo;來(lái)每次生成/返回一個(gè)對(duì)象;

3)生成器中有多少&lsquo;yield&rsquo;語(yǔ)句,你可以自定義;

4)每次&lsquo;yield&rsquo;暫停循環(huán)時(shí),生成器會(huì)保存本地變量的狀態(tài)。而迭代器并不會(huì)使用局部變量,它只需要一個(gè)可迭代對(duì)象進(jìn)行迭代;

5)使用類(lèi)可以實(shí)現(xiàn)你自己的迭代器,但無(wú)法實(shí)現(xiàn)生成器;

6)生成器運(yùn)行速度快,語(yǔ)法簡(jiǎn)潔,更簡(jiǎn)單;

7)迭代器更能節(jié)約內(nèi)存。

Q66.函數(shù)zip()的是干嘛的?

Python新手可能對(duì)這個(gè)函數(shù)不是很熟悉,zip()可以返回元組的迭代器。

list(zip([&lsquo;a&rsquo;,&lsquo;b&rsquo;,&lsquo;c&rsquo;],[1,2,3]))

[(&lsquo;a&rsquo;,1), (&lsquo;b&rsquo;, 2), (&lsquo;c&rsquo;, 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()

&lsquo;C:\Users\37410\Desktop\代碼&rsquo;

Q68.如何計(jì)算一個(gè)字符串的長(zhǎng)度?

這個(gè)也比較簡(jiǎn)單,在我們想計(jì)算長(zhǎng)度的字符串上調(diào)用函數(shù)len()即可。

len(&lsquo;Data 123&rsquo;)

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()

過(guò)濾器允許我們根據(jù)條件邏輯過(guò)濾一些值。

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.編寫(xiě)一個(gè)Python程序來(lái)計(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.編寫(xiě)一個(gè)Python程序來(lái)讀取文件中的隨機(jī)行

import random

def random_line(fname):

lines = open(fname).read().splitlines()

return random.choice(lines)

print(random_line('test.txt'))

Q73.編寫(xiě)一個(gè)Python程序來(lái)計(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)寫(xiě)一個(gè)Python邏輯,計(jì)算一個(gè)文件中的大寫(xiě)字母數(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ù)集編寫(xiě)排序算法

以下代碼可用于在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è)專(zhuān)有名詞:MVT,

M全拼為Model,與MVC中的M功能相同,負(fù)責(zé)數(shù)據(jù)處理,內(nèi)嵌了ORM框架;

V全拼為View,與MVC中的C功能相同,接收HttpRequest,業(yè)務(wù)處理,返回HttpResponse;

T全拼為T(mén)emplate,與MVC中的V功能相同,負(fù)責(zé)封裝構(gòu)造要返回的html,內(nèi)嵌了模板引擎

Q77.Django,Pyramid和Flask之間的差異

Flask是一個(gè)“微框架”,主要用于具有更簡(jiǎn)單要求的小型應(yīng)用程序。

Pyramid適用于大型應(yīng)用程序,具有靈活性,允許開(kāi)發(fā)人員為他們的項(xiàng)目使用數(shù)據(jù)庫(kù),URL結(jié)構(gòu),模板樣式等正確的工具。

Django也可以像Pyramid一樣用于更大的應(yīng)用程序。它包括一個(gè)ORM。

Q78.討論Django架構(gòu)

Django架構(gòu)

開(kāi)發(fā)人員提供模型,視圖和模板,然后將其映射到URL,Django可以為用戶提供服務(wù)。

Q79.解釋如何在Django中設(shè)置數(shù)據(jù)庫(kù)

Django使用SQLite作為默認(rèn)數(shù)據(jù)庫(kù),它將數(shù)據(jù)作為單個(gè)文件存儲(chǔ)在文件系統(tǒng)中。

如過(guò)你有數(shù)據(jù)庫(kù)服務(wù)器-PostgreSQL,MySQL,Oracle,MSSQL-并且想要使用它而不是SQLite,那么使用數(shù)據(jù)庫(kù)的管理工具為你的Django項(xiàng)目創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)。

無(wú)論哪種方式,在您的(空)數(shù)據(jù)庫(kù)到位的情況下,剩下的就是告訴Django如何使用它。

這是項(xiàng)目的settings.py文件的來(lái)源。

我們將以下代碼行添加到setting.py文件中:

DATABASES ={&lsquo;default&rsquo;: {&lsquo;ENGINE&rsquo;: &lsquo;django.db.backends.sqlite3&rsquo;, &lsquo;NAME&rsquo;: os.path.join(BASE_DIR, &lsquo;db.sqlite3&rsquo;),

Q80.舉例說(shuō)明如何在Django中編寫(xiě)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)訪問(wèn)者存儲(chǔ)和檢索數(shù)據(jù)。

Django通過(guò)在客戶端放置會(huì)話ID cookie并在服務(wù)器端存儲(chǔ)所有相關(guān)數(shù)據(jù)來(lái)抽象發(fā)送和接收cookie的過(guò)程。

所以數(shù)據(jù)本身并不存儲(chǔ)在客戶端。

從安全角度來(lái)看,這很好。

Q83.列出Django中的繼承樣式

在Django中,有三種可能的繼承樣式:

抽象基類(lèi):當(dāng)你只希望父類(lèi)包含而你不想為每個(gè)子模型鍵入的信息時(shí)使用;

多表繼承:對(duì)現(xiàn)有模型進(jìn)行子類(lèi)化,并且需要每個(gè)模型都有自己的數(shù)據(jù)庫(kù)表。

代理模型:只想修改模型的Python級(jí)別行為,而無(wú)需更改模型的字段。

數(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)有一定的局限性

它們不支持元素化加法和乘法等“向量化”操作,可以包含不同類(lèi)型的對(duì)象這一事實(shí)意味著Python必須存儲(chǔ)每個(gè)元素的類(lèi)型信息,并且必須在操作時(shí)執(zhí)行類(lèi)型調(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ù)或類(lèi)中的代碼。

使用裝飾器,您可以包裝類(lèi)或函數(shù)方法調(diào)用,以便在執(zhí)行原始代碼之前或之后執(zhí)行一段代碼。

裝飾器可用于檢查權(quán)限,修改或跟蹤傳遞給方法的參數(shù),將調(diào)用記錄到特定方法等

Q89.NumPy和SciPy有什么區(qū)別?

1)在理想的世界中,NumPy只包含數(shù)組數(shù)據(jù)類(lèi)型和最基本的操作:索引,排序,重新整形,基本元素函數(shù)等。

2)所有數(shù)字代碼都將駐留在SciPy中。然而,NumPy的一個(gè)重要目標(biāo)是兼容性,因此NumPy試圖保留其前任任何一個(gè)支持的所有功能。

3)因此,NumPy包含一些線性代數(shù)函數(shù),即使它們更恰當(dāng)?shù)貙儆赟ciPy。無(wú)論如何,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可視化功能。

爬蟲(chóng)和scary框架

Q91.scrapy和scrapy-redis有什么區(qū)別?為什么選擇redis數(shù)據(jù)庫(kù)?

scrapy是一個(gè)Python爬蟲(chóng)框架,爬取效率極高,具有高度定制性,但是不支持分布式。

而scrapy-redis一套基于redis數(shù)據(jù)庫(kù)、運(yùn)行在scrapy框架之上的組件,可以讓scrapy支持分布式策略,Slaver端共享Master端redis數(shù)據(jù)庫(kù)里的item隊(duì)列、請(qǐng)求隊(duì)列和請(qǐng)求指紋集合。

因?yàn)閞edis支持主從同步,而且數(shù)據(jù)都是緩存在內(nèi)存中的,所以基于redis的分布式爬蟲(chóng),對(duì)請(qǐng)求和數(shù)據(jù)的高頻讀取效率非常高。

Q92.你用過(guò)的爬蟲(chóng)框架或者模塊有哪些?

Python自帶:urllib,urllib2

第 三 方:requests

框 架:Scrapy

urllib和urllib2模塊都做與請(qǐng)求URL相關(guān)的操作,但他們提供不同的功能。

urllib2.:urllib2.urlopen可以接受一個(gè)Request對(duì)象或者url,(在接受Request對(duì)象時(shí)候,并以此可以來(lái)設(shè)置一個(gè)URL 的headers),urllib.urlopen只接收一個(gè)url

urllib 有urlencode,urllib2沒(méi)有,因此總是urllib,urllib2常會(huì)一起使用的原因

scrapy是封裝起來(lái)的框架,他包含了下載器,解析器,日志及異常處理,基于多線程,。

twisted的方式處理,對(duì)于固定單個(gè)網(wǎng)站的爬取開(kāi)發(fā),有優(yōu)勢(shì);但是對(duì)于多網(wǎng)站爬取 100個(gè)網(wǎng)站,并發(fā)及分布式處理方面,不夠靈活,不便調(diào)整與括展。

request 是一個(gè)HTTP庫(kù), 它只是用來(lái),進(jìn)行請(qǐng)求,對(duì)于HTTP請(qǐng)求,他是一個(gè)強(qiáng)大的庫(kù),下載,解析全部自己處理,靈活性更高,高并發(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 類(lèi)型的索引;

6)InnoDB 中不保存表的行數(shù),如 select count(*) from table 時(shí),InnoDB;

需要掃描一遍整個(gè)表來(lái)計(jì)算有多少行,但是 MyISAM 只要簡(jiǎn)單的讀出保存好的行數(shù)即可。

注意的是,當(dāng) count(*)語(yǔ)句包含 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 &lsquo;%lee%&rsquo;

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)交給自己編寫(xiě)的解析方法做提取處理:

如果提取出需要的數(shù)據(jù),則交給管道文件處理;

2)如果提取出url,則繼續(xù)執(zhí)行之前的步驟(發(fā)送url請(qǐng)求,并由引擎將請(qǐng)求交給調(diào)度器入隊(duì)列&hellip;),直到請(qǐng)求隊(duì)列里沒(méi)有請(qǐng)求,程序結(jié)束。

Q95.什么是關(guān)聯(lián)查詢,有哪些?

將多個(gè)表聯(lián)合起來(lái)進(jìn)行查詢,主要有內(nèi)連接、左連接、右連接、全連接(外連接)

Q96.寫(xiě)爬蟲(chóng)是用多進(jìn)程好?還是多線程好? 為什么?

IO密集型代碼(文件處理、網(wǎng)絡(luò)爬蟲(chóng)等),多線程能夠有效提升效率(單線程下有IO操作會(huì)進(jìn)行IO等待,造成不必要的時(shí)間浪費(fèi),

而開(kāi)啟多線程能在線程A等待時(shí),自動(dòng)切換到線程B,可以不浪費(fèi)CPU的資源,從而能提升程序執(zhí)行效率)。

在實(shí)際的數(shù)據(jù)采集過(guò)程中,既考慮網(wǎng)速和響應(yīng)的問(wèn)題,也需要考慮自身機(jī)器的硬件情況來(lái)設(shè)置多進(jìn)程或多線程。

Q97.數(shù)據(jù)庫(kù)的優(yōu)化?

1)優(yōu)化索引、SQL 語(yǔ)句、分析慢查詢;

2)優(yōu)化硬件;采用SSD,使用磁盤(pán)隊(duì)列技術(shù)(RAID0,RAID1,RDID5)等;

3)采用MySQL 內(nèi)部自帶的表分區(qū)技術(shù),把數(shù)據(jù)分層不同的文件,能夠提高磁盤(pán)的讀取效率;

4)選擇合適的表引擎,參數(shù)上的優(yōu)化;

5)進(jìn)行架構(gòu)級(jí)別的緩存,靜態(tài)化和分布式;

6)采用更快的存儲(chǔ)方式,例如 NoSQL存儲(chǔ)經(jīng)常訪問(wèn)的數(shù)據(jù)

Q98.分布式爬蟲(chóng)主要解決什么問(wèn)題?

1)ip

2)帶寬

3)cpu

4)io

Q99.爬蟲(chóng)過(guò)程中驗(yàn)證碼怎么處理?

1)scrapy自帶

2)付費(fèi)接口

Q100.常見(jiàn)的反爬蟲(chóng)和應(yīng)對(duì)方法?

1)通過(guò)Headers反爬蟲(chóng)從用戶請(qǐng)求的Headers反爬蟲(chóng)是最常見(jiàn)的反爬蟲(chóng)策略。

可以直接在爬蟲(chóng)中添加Headers,將瀏覽器的User-Agent復(fù)制到爬蟲(chóng)的Headers中;或者將Referer值修改為目標(biāo)網(wǎng)站域名。

2)基于用戶行為反爬蟲(chóng)

通過(guò)檢測(cè)用戶行為,例如同一IP短時(shí)間內(nèi)多次訪問(wèn)同一頁(yè)面,或者同一賬戶短時(shí)間內(nèi)多次進(jìn)行相同操作。

大多數(shù)網(wǎng)站都是前一種情況,對(duì)于這種情況,使用IP代理就可以解決。

可以專(zhuān)門(mén)寫(xiě)一個(gè)爬蟲(chóng),爬取網(wǎng)上公開(kāi)的代理ip,檢測(cè)后全部保存起來(lái)。

有了大量代理ip后可以每請(qǐng)求幾次更換一個(gè)ip,這在requests或者urllib2中很容易做到,這樣就能很容易的繞過(guò)第一種反爬蟲(chóng)。

對(duì)于第二種情況,可以在每次請(qǐng)求后隨機(jī)間隔幾秒再進(jìn)行下一次請(qǐng)求。

有些有邏輯漏洞的網(wǎng)站,可以通過(guò)請(qǐng)求幾次,退出登錄,重新登錄,繼續(xù)請(qǐng)求來(lái)繞過(guò)同一賬號(hào)短時(shí)間內(nèi)不能多次進(jìn)行相同請(qǐng)求的限制。

3)動(dòng)態(tài)頁(yè)面的反爬蟲(chóng)

首先用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ù)全部加密了,沒(méi)辦法構(gòu)造自己所需要的數(shù)據(jù)的請(qǐng)求。

這種情況下就用selenium+phantomJS,調(diào)用瀏覽器內(nèi)核,并利用phantomJS執(zhí)行js來(lái)模擬人為操作以及觸發(fā)頁(yè)面中的js腳本。

以上就是“Python常問(wèn)的面試題有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI