11.20 阿里巴巴2W+薪資!Python開發工程師高頻面試真題!(建議收藏)

1 遇到過得反爬蟲策略以及解決方法?

1.通過headers反爬蟲


2.基於用戶行為的發爬蟲:(同一IP短時間內訪問的頻率)
3.動態網頁反爬蟲(通過ajax請求數據,或者通過JavaScript生成)
4.對部分數據進行加密處理的(數據是亂碼)

解決方法:

對於基本網頁的抓取可以自定義headers,添加headers的數據
使用多個代理ip進行抓取或者設置抓取的頻率降低一些,
動態網頁的可以使用selenium + phantomjs 進行抓取
對部分數據進行加密的,可以使用selenium進行截圖,使用python自帶的pytesseract庫進行識別,但是比較慢最直接的方法是找到加密的方法進行逆向推理。

阿里巴巴2W+薪資!Python開發工程師高頻面試真題!(建議收藏)

2 scrapy分為幾個組成部分?分別有什麼作用?

分為5個部分;Spiders(爬蟲類),Scrapy Engine(引擎),Scheduler(調度器),Downloader(下載器),Item Pipeline(處理管道)。

  • Spiders:開發者自定義的一個類,用來解析網頁並抓取指定url返回的內容。
  • Scrapy Engine:控制整個系統的數據處理流程,並進行事務處理的觸發。
  • Scheduler:接收Engine發出的requests,並將這些requests放入到處理列隊中,以便之後engine需要時再提供。
  • Download:抓取網頁信息提供給engine,進而轉發至Spiders。
  • Item Pipeline:負責處理Spiders類提取之後的數據。
    比如清理HTML數據、驗證爬取的數據(檢查item包含某些字段)、查重(並丟棄)、將爬取結果保存到數據庫中
  • 正在學習python的小夥伴或者打算學習的,可以私信小編“01”領取資料!

3 簡述一下scrapy的基本流程?

阿里巴巴2W+薪資!Python開發工程師高頻面試真題!(建議收藏)

scrapy分為9個步驟:

  1. Spiders需要初始的start_url或則函數stsrt_requests,會在內部生成Requests給Engine;
  2. Engine將requests發送給Scheduler;
  3. Engine從Scheduler那獲取requests,交給Download下載;
  4. 在交給Dowmload過程中會經過Downloader Middlewares(經過process_request函數);
  5. Dowmloader下載頁面後生成一個response,這個response會傳給Engine,這個過程中又經過了Downloader Middlerwares(經過process_request函數),在傳送中出錯的話經過process_exception函數;
  6. Engine將從Downloader那傳送過來的response發送給Spiders處理,這個過程經過Spiders Middlerwares(經過process_spider_input函數);
  7. Spiders處理這個response,返回Requests或者Item兩個類型,傳給Engine,這個過程又經過Spiders Middlewares(經過porcess_spider_output函數);
  8. Engine接收返回的信息,如果使Item,將它傳給Items Pipeline中;如果是Requests,將它傳給Scheduler,繼續爬蟲;
  9. 重複第三步,直至沒有任何需要爬取的數據
  10. 正在學習python的小夥伴或者打算學習的,可以私信小編“01”領取資料!
阿里巴巴2W+薪資!Python開發工程師高頻面試真題!(建議收藏)

5 字符串 "123" 轉換成 123,不使用內置api,例如 int()

方法一: 利用 str 函數

def atoi(s):
num = 0
for v in s:
for j in range(10):
if v == str(j):
num = num * 10 + j
return num

方法二: 利用 ord 函數

def atoi(s):
num = 0

for v in s:
num = num * 10 + ord(v) - ord('0')
return num

方法三: 利用 eval 函數

def atoi(s):
num = 0
for v in s:
t = "%s * 1" % v
n = eval(t)
num = num * 10 + n
return num

方法四: 結合方法二,使用 reduce,一行解決

from functools import reduce
def atoi(s):
return reduce(lambda num, v: num * 10 + ord(v) - ord('0'), s, 0)

結尾

最後多說一句,小編是一名python開發工程師,這裡有我自己整理了一套最新的python系統學習教程,包括從基礎的python腳本到web開發、爬蟲、數據分析、數據可視化、機器學習等。想要這些資料的可以關注小編,並在後臺私信小編:“01”即可領取。


分享到:


相關文章: