python爬蟲數據采集


 

       近幾年來,python的熱度一直特別火!大學期間,也進行了一番深入學習,畢業后也曾試圖把python作為自己的職業方向,雖然沒有如願成為一名python工程師,但掌握了python,也讓我現如今的工作開展和職業發展更加得心應手。這篇文章主要與大家分享一下自己在python爬蟲方面的收獲與見解。

       python爬蟲是大家最為熟悉的一種python應用途徑,由於python具有豐富的第三方開發庫,所以它可以開展很多工作:比如 web開發(django)、應用程序開發(tkinter、wxpython、qt)、數據統計與計算(numpy)、圖形圖像處理、深度學習、人工智能等。平時自己使用最多的是python爬蟲(結合tkinter,開發爬蟲應用程序)和使用django開發一些小型個人網站,django框架可以自動根據實體類生成管理端,極大的提升了系統的開發效率,有興趣的朋友可以嘗試一下。

       一個成功的爬蟲需要對應一個標准化的網站,爬蟲主要是為了方便我們獲取數據,如果目標系統開發不規范,無規則,很難用爬蟲定制一套規則去爬取,並且爬蟲基本是定制化的,對於不同的系統需要去調整。

       爬蟲爬取數據的第一步必須分析目標網站的技術以及網站數據結構(通過前端源碼),可借助chrome瀏覽器,目前python爬蟲主要會面對一下三種網站

1. 前后端分離網站

        前端通過傳遞參數訪問接口,后端返回json數據,對於此類網站,python可模擬瀏覽器前端,發送參數然后接收數據,便完成了爬蟲數據的目標

2. 靜態網站

         通過python的第三方庫(requests、urllib),下載源碼,通過xpath、正則匹配數據

3.動態網站

          如果采用第2種方法,下載的源碼只是簡單的html,源碼中沒有任何數據,因為此類動態網站需要js加載后,源碼中才會有數據,對於此類網站,可以借助自動化測試工具selenium

爬蟲步驟

  1. 分析網站技術與目標數據的結構
  2. 根據第一步分析結構,選擇對應的技術策略
  3. 爬取數據
  4. 提升性能,提高操作舒適度(結合客戶端技術,為爬蟲定制界面)
  5. 根據需求進行數據清洗
  6. 數據儲存,存儲到數據庫、文檔

反扒機制

1. 當系統判斷同屬一個ip的客戶端不間斷多次訪問,會拒絕此ip的訪問

        解決方案:動態代理,不停的更換ip去訪問目標系統,或者從免費的ip代理網站爬取ip,創建ip池,如果目標數據量不大,可通過降低訪問速度,以規避反扒

2. 目標系統需要注冊登錄才能訪問

        解決方案:通過python的第三方庫(Faker)生成假登錄名、密碼、個人數據進行自動化注冊、登錄

3. 目標系統的中目標數據頁面的鏈接需要處理才能進入目標數據頁進行訪問

         解決方案:獲取到目標網站的目標數據頁鏈接無法正常訪問,需要研究頁面中的js腳本,對鏈接進行處理,我個人曾通過搜狗瀏覽器爬取微信號文章時,就遇到過這個問題,爬取到的文章鏈接需要進過js腳本進行拼接,才能獲得正確的鏈接地址

獲取目標數據的位置

  1. 通過xpath獲得數據的位置,可借助chrome瀏覽器調試功能獲得對應數據的xpath路徑
  2. 通過正則匹配

python爬蟲第三方常用

urllib/requests  請求庫
Faker            生成假數據
UserAgent        生成假數據頭
etree、beautsoup 匹配數據
json             處理json數據
re               正則庫
selenium         自動化測試庫
sqlite3          數據庫 python3自帶

爬取靜態網頁數據

import requests
from fake_useragent import UserAgent  #提供假的請求頭
from lxml import etree  # 匹配數據
#爬取目標頁面的url
url='http://***ip****:8085/pricePublic/house/public/index'
headers= {'User-Agent':str(UserAgent().random)}
response=requests.get(url,headers=headers)
# 獲得網頁源碼
content=response.text
html=etree.HTML(content)
#使用xpath查找對應標簽處的元素值,pageNum此處爬取對應頁面的頁碼
pageNum=html.xpath('//*[@id="dec"]/div[2]/div/span[1]/text()')

爬取前后端分離系統的數據

import json
import requests
#獲取返回的response
url='http://***ip***/FindById/22'
response=requests.get(url)
#通過json庫解析json,獲得返回的數據
DataNode = json.loads(response.text).get('returndata').get('data')[0]

爬取動態數據

       以下代碼示例采用google瀏覽器,使用selenium庫,將瀏覽器設置為無頭模式,爬蟲會配合瀏覽器在后台模擬人工操作,根據代碼中定義的xpath地址,爬蟲會在瀏覽器中找到相應位置進行操作,使用selenium爬取數據時需要安裝對應版本的瀏覽器驅動器

import requests
from faker import Faker
from fake_useragent import UserAgent
from lxml import etree
url='http://***ip***/FindById/22'
#通過faker庫獲得假email和電話號碼
fake=Fakeer('zh_CN')
email=fake.email()
tel=fake.phone_number()
data={
"email":email
}
#使用requests庫發送post請求
response=requests.post(url,data,headers=headers)
code=response.status_code
content=response.text
#獲得返回的cookies並轉換為字典形式
cookies = requests.utils.dict_from_cookiejar(response.cookies)
#請求的時候帶上cookies
response=requests.get(url,headers=headers,cookies=cookies)

       作為一個合法的公民,爬蟲只是一種技術,我們使用其爬取目標數據時,一定需要遵守一定的規則,每個網站的根目錄下都會存在一個robots.txt(爬蟲協議)文件,規定了那些網頁可以被訪問,對於爬取公開的信息數據時,且不可對目標系統造成嚴重的破壞,所以我們呼吁,大家在利用各項技術開展工作的過程中,務必要符合各項技術規定和制度規范,一起為你、我、他創造文明的網絡環境!

關注微信公眾號:菜鳥阿都


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM