爬蟲(又被稱爲網頁蜘蛛,網絡機器人)就是模擬客戶端發送網絡請求,接收請求響應,一種按照一定的規則,自動地抓取互聯網信息的程序。
原則上,只要是瀏覽器(客戶端)能做的事情,爬蟲都能夠做。
根據被爬網站的數量的不同,我們把爬蟲分爲:
- 通用爬蟲 :通常指搜索引擎的爬蟲
- 聚焦爬蟲 :針對特定網站的爬蟲
Robots協議:網站通過Robots協議告訴搜索引擎哪些頁面可以抓取,哪些頁面不能抓取,但它僅僅是道德層面上的約束。
瀏覽器會主動請求js,css等內容,js會修改頁面的內容,js也可以重新發送請求,最後瀏覽器渲染出來的內容在elements中,其中包含css,圖片,js,url地址對應的響應等。
但是在爬蟲中,爬蟲只會請求url地址,對應的拿到url地址對應的響應。瀏覽器渲染出來的頁面和爬蟲請求的頁面並不一樣。所以在爬蟲中,需要以url地址對應的響應爲準來進行數據的提取。
url的形式:scheme://host[:port#]/path/…/[?query-string][#anchor]
- scheme:協議(例如:http, https, ftp)
- host:服務器的IP地址或者域名
- port:服務器的端口(如果是走協議默認端口,80 or 443)
- path:訪問資源的路徑
- query-string:參數,發送給http服務器的數據
- anchor:錨(跳轉到網頁的指定錨點位置)
HTTP:超文本傳輸協議,默認端口號:80
HTTPS:HTTP + SSL(安全套接字層),默認端口號:443 (HTTPS比HTTP更安全,但是性能更低)
HTTP常見請求頭
- Host (主機和端口號)
- Connection (鏈接類型)
- Upgrade-Insecure-Requests (升級爲HTTPS請求)
- User-Agent (瀏覽器名稱)
- Accept (傳輸文件類型)
- Referer (頁面跳轉處)
- Accept-Encoding(文件編解碼格式)
- Cookie (Cookie)
- x-requested-with :XMLHttpRequest (是Ajax 異步請求)
常見的請求方法
- GET
- POST
- 我剛整理了一套2018最新的0基礎入門和進階教程,無私分享,加Python學習q-u-n :二二七,四三五,四五零 即可獲取,內附:開發工具和安裝包,以及系統學習路線圖
有關 GET 請求的其他一些註釋:
- GET 請求可被緩存
- GET 請求保留在瀏覽器歷史記錄中
- GET 請求可被收藏爲書籤
- GET 請求不應在處理敏感數據時使用
- GET 請求有長度限制
- GET 請求只應當用於取回數據
有關 POST 請求的其他一些註釋:
- POST 請求不會被緩存
- POST 請求不會保留在瀏覽器歷史記錄中
- POST 不能被收藏爲書籤
- POST 請求對數據長度沒有要求
響應狀態碼(status code)
常見的狀態碼:
- 200:成功
- 302:臨時轉移至新的url
- 307:臨時轉移至新的url
- 404:not found
- 500:服務器內部錯誤
代理IP的分類:
透明代理(Transparent Proxy),透明代理雖然可以直接“隱藏”你的IP地址,但是還是可以從HTTP_X_FORWARDED_FOR來查到你是誰。
匿名代理(Anonymous Proxy),匿名代理比透明代理進步了一點:別人只能知道你用了代理,無法知道你是誰。
混淆代理(Distorting Proxies),與匿名代理相同,如果使用了混淆代理,別人還是能知道你在用代理,但是會得到一個假的IP地址,僞裝的更逼真。
高匿代理(Elite proxy或High Anonymity Proxy),高匿代理讓別人根本無法發現你是在用代理,所以是最好的選擇。
Scrapy是一個爲了爬取網站數據,提取結構性數據而編寫的應用框架,我們只需要實現少量的代碼,就能夠快速的抓取。
Scrapy 使用了Twisted['twɪstɪd]異步網絡框架,可以加快我們的下載速度。
- 異步:調用在發出之後,這個調用就直接返回,不管有無結果
- 非阻塞:關注的是程序在等待調用結果(消息,返回值)時的狀態,指在不能立刻得到結果之前,該調用不會阻塞當前線程。
scrapy的流程
從上圖可以衍生出下圖,個人覺得更加好理解一些
其流程可以描述如下:
- 調度器把requests-->引擎-->下載中間件--->下載器
- 下載器發送請求,獲取響應---->下載中間件---->引擎--->爬蟲中間件--->爬蟲
- 爬蟲提取url地址,組裝成request對象---->爬蟲中間件--->引擎--->調度器
- 爬蟲提取數據--->引擎--->管道
- 管道進行數據的處理和保存
scrapy中每個模塊的具體作用:
scrapy項目實現流程:
- 創建一個scrapy項目:scrapy startproject +<項目名字>
- 生成一個爬蟲:scrapy genspider +<爬蟲名字> + <允許爬取的域名>
- 提取數據:完善spider,使用xpath等方法
- 保存數據:pipeline中保存數據
scrapy.cfg :項目的配置文件 mySpider/ :項目的Python模塊,將會從這裏引用代碼 mySpider/items.py :項目的目標文件 mySpider/pipelines.py :項目的管道文件 mySpider/settings.py :項目的設置文件 mySpider/spiders/ :存儲爬蟲代碼目錄
認識scrapy的debug信息
每次程序啓動後,默認情況下,終端都會出現很多的debug信息,那麼下面我們來簡單認識下這些信息
scrapy shell的使用
- response.url:當前響應的url地址
- response.request.url:當前響應對應的請求的url地址
- response.headers:響應頭
- response.body:響應體,也就是html代碼,默認是byte類型
- response.requests.headers:當前響應的請求頭
settings.py中的重點字段和內涵
- USER_AGENT 設置ua
- ROBOTSTXT_OBEY 是否遵守robots協議,默認是遵守
- CONCURRENT_REQUESTS 設置併發請求的數量,默認是16個
- DOWNLOAD_DELAY 下載延遲,默認無延遲
- COOKIES_ENABLED 是否開啓cookie,即每次請求帶上前一次的cookie,默認是開啓的
- DEFAULT_REQUEST_HEADERS 設置默認請求頭
- SPIDER_MIDDLEWARES 爬蟲中間件,設置過程和管道相同
- DOWNLOADER_MIDDLEWARES 下載中間件