1. 程式人生 > >爬蟲常見問題與解答

爬蟲常見問題與解答

穩定 pip tle 共享棧 ear 緩存 模擬 過程 問題

--題目--
(1) 列舉python網絡爬蟲所引用的模塊包,提取數據用到的模塊(至少各2個)

  requests、urllib | jsonpath xpath beautifulsoup


(2)瀏覽器請求某網站時,從輸入到頁面顯示出來,描述一下請求過程

  1.敲域名回車
  2.查詢本地的DNS緩存,以找到域名對應的主機IP地址(若有,則跳到4)
  3.查詢遠程域名根DNS,找到IP地址
  4.向遠程IP地址的服務器發送請求(若請求失敗且未經過2,則返回2,若再再次失敗,返回錯誤代碼)
  5.服務器響應請求,向用戶發送數據
  6.瀏覽器對返回的數據進行處理(瀏覽器渲染)
  7.顯示


(3) 爬蟲在爬取數據,網站有反爬時如何解決

  通過headers反爬蟲:解決策略,偽造headers
  基於用戶行為反爬蟲:動態變化去爬取數據,模擬普通用戶的行為
  基於動態頁面的反爬蟲:跟蹤服務器發送的ajax請求,模擬ajax請求

(4) 如果爬數據時ip被封了,如何解決

  1、放慢抓取速度,減小對於目標網站造成的壓力。但是這樣會減少單位時間類的抓取量。
  2、第二種方法是通過設置代理IP等手段,突破反爬蟲機制繼續高頻率抓取。需多個穩定的代理IP


(5)如何解決登錄時有驗證碼的問題,列出你知道的狀態碼(至少3個)

   一、篩選得到隱藏信息
    進入開發者工具(按F12),找到其中的Network後,手動的先進行一次登錄,找到其中的第一個請求,在Header的底部會有一個data的數據段,這個就是登錄所需的信息。如果想對其中的隱藏信息進行修改先獲取網頁Html的內容

  二、將信息進行提交
  找到源碼中提交表單所需要的action,和method使用

  三、獲取登錄後的信息
  信息提交後模擬登錄就成功了,接下來就可以獲取登錄後的信息了,如果有驗證碼,則提取其中的cookie,請求時攜帶cookie訪問。

  狀態碼:
  200 OK:請求成功
  301 重定向所請求的頁面已經轉移至新的url。
  403 Forbidden — 對被請求頁面的訪問被禁止
  404 Not Found — 服務器無法找到被請求的頁面
  500 Internal Server Error — 請求未完成。服務器遇到不可預知的情況
  504 Gateway Timeout — 網關超時


(6) 什麽是進程 線程 協程

  進程擁有自己獨立的堆和棧,既不共享堆,亦不共享棧,進程由操作系統調度。
  線程擁有自己獨立的棧和共享的堆,共享堆,不共享棧,線程亦由操作系統調度(標準線程是的)。
  協程和線程一樣共享堆,不共享棧,協程由程序員在協程的代碼裏顯示調度。

  參考網址: https://blog.csdn.net/hairetz/article/details/16119911


(7)自動化測試工具用什麽包,如何使用有什麽功能

  selenium+phantomJS 一個是自動化測試工具,一個是無界面的瀏覽器,他倆配合可以模擬一個用戶
  鼠標點擊瀏覽器的動作,從而在其中獲取到相應數據


(8) scrapy中的pipeline 有什麽作用

  pipeline(管道):它負責處理spider中獲取道德item,並進行後期處理(如過濾,存儲)


(9)模擬抓取某網站的第一頁,輸出匹配公告名字
  要求:網址:baseurl,匹配:title

  

import urllib.request 
import re 

def fetch(baseUrl): 

# 第1步:模擬瀏覽器發送請求 
data = urllib.request.urlopen(baseUrl).read() #二進制字節形式 
data = data.decode(utf-8) 

# 第2步:頁面返回後,利用正則表達式提取想要的內容 
nameList=[] 
nameList = re.compile(rtarget="_blank" title="(.*?)",re.S).search(data) 

# 第3步:返回在頁面上析取的“標題名” 
return nameList 

####### 執行 ######## 
if __name__ =="__main__": 

#要抓取的網頁地址 
url = "http://www.sxszbb.com/sxztb/jyxx/001001/MoreInfo.aspx?CategoryNum=001001" 

#存放到名字列表中 
NameList = fetch(url) 

# 輸出 NameList 
Length = len(NameList) 
for i in range(0, Length): 
print("標題名%d:%s\n"%(i+1, NameList[i]))


爬蟲常見問題與解答