本文目錄一覽:
如何利用python爬蟲獲取數據
python是一款應用非常廣泛的腳本程序語言,谷歌公司的網頁就是用python編寫。python在生物信息、統計、網頁製作、計算等多個領域都體現出了強大的功能。python和其他腳本語言如java、R、Perl一樣,都可以直接在命令行里運行腳本程序。工具/原料python;CMD命令行;windows操作系統方法/步驟1、首先下載安裝python,建議安裝2.7版本以上,3.0版本以下,由於3.0版本以上不向下兼容,體驗較差。2、打開文本編輯器,推薦editplus,notepad等,將文件保存成.py格式,editplus和notepad支持識別python語法。腳本第一行一定要寫上#!usr/bin/python表示該腳本文件是可執行python腳本如果python目錄不在usr/bin目錄下,則替換成當前python執行程序的目錄。3、編寫完腳本之後注意調試、可以直接用editplus調試。調試方法可自行百度。腳本寫完之後,打開CMD命令行,前提是python已經被加入到環境變量中,如果沒有加入到環境變量,請百度4、在CMD命令行中,輸入「python」+「空格」,即」python「;將已經寫好的腳本文件拖拽到當前光標位置,然後敲回車運行即可。
如何用python 爬蟲抓取金融數據
獲取數據是數據分析中必不可少的一部分,而網絡爬蟲是是獲取數據的一個重要渠道之一。鑒於此,我拾起了Python這把利器,開啟了網絡爬蟲之路。
本篇使用的版本為python3.5,意在抓取證券之星上當天所有A股數據。程序主要分為三個部分:網頁源碼的獲取、所需內容的提取、所得結果的整理。
一、網頁源碼的獲取
很多人喜歡用python爬蟲的原因之一就是它容易上手。只需以下幾行代碼既可抓取大部分網頁的源碼。
import urllib.request
url=’ar.com/stock/ranklist_a_3_1_1.html’ #目標網址headers={“User-Agent”:”Mozilla/5.0 (Windows NT 10.0; WOW64)”} #偽裝瀏覽器請求報頭request=urllib.request.Request(url=url,headers=headers) #請求服務器response=urllib.request.urlopen(request) #服務器應答content=response.read().decode(‘gbk’) #以一定的編碼方式查看源碼print(content) #打印頁面源碼
雖說抓一頁的源碼容易,不過在一個網站內大量抓取網頁源碼卻經常遭到服務器攔截,頓時感覺世界充滿了惡意。於是我開始研習突破反爬蟲限制的功法。
1.偽裝流浪器報頭
很多服務器通過瀏覽器發給它的報頭來確認是否是人類用戶,所以我們可以通過模仿瀏覽器的行為構造請求報頭給服務器發送請求。服務器會識別其中的一些參數來識別你是否是人類用戶,很多網站都會識別User-Agent這個參數,所以請求頭最好帶上。有一些警覺性比較高的網站可能還會通過其他參數識別,比如通過Accept-Language來辨別你是否是人類用戶,一些有防盜鏈功能的網站還得帶上referer這個參數等等。
2.隨機生成UA
證券之星只需帶User-Agent這個參數就可以抓取頁面信息了,不過連續抓取幾頁就被服務器阻止了。於是我決定每次抓取數據時模擬不同的瀏覽器發送請求,而服務器通過User-Agent來識別不同瀏覽器,所以每次爬取頁面可以通過隨機生成不同的UA構造報頭去請求服務器,
3.減慢爬取速度
雖然模擬了不同瀏覽器爬取數據,但發現有的時間段可以爬取上百頁的數據,有時候卻只能爬取十來頁,看來服務器還會根據你的訪問的頻率來識別你是人類用戶還是網絡爬蟲。所以我每抓取一頁都讓它隨機休息幾秒,加入此句代碼後,每個時間段都能爬取大量股票數據了。
4.使用代理IP
天有不測風雲,程序在公司時順利測試成功,回寢室後發現又只能抓取幾頁就被服務器阻止了。驚慌失措的我趕緊詢問度娘,獲知服務器可以識別你的IP,並記錄此IP訪問的次數,可以使用高匿的代理IP,並在抓取的過程中不斷的更換,讓服務器無法找出誰是真兇。此功還未修成,欲知後事如何,請聽下回分解。
5.其他突破反爬蟲限制的方法
很多服務器在接受瀏覽器請求時會發送一個cookie文件給瀏覽器,然後通過cookie來跟蹤你的訪問過程,為了不讓服務器識別出你是爬蟲,建議最好帶上cookie一起去爬取數據;如果遇上要模擬登陸的網站,為了不讓自己的賬號被拉黑,可以申請大量的賬號,然後再爬入,此處涉及模擬登陸、驗證碼識別等知識,暫時不再深究…總之,對於網站主人來說,有些爬蟲確實是令人討厭的,所以會想出很多方法限制爬蟲的進入,所以我們在強行進入之後也得注意些禮儀,別把人家的網站給拖垮了。
二、所需內容的提取
獲取網頁源碼後,我們就可以從中提取我們所需要的數據了。從源碼中獲取所需信息的方法有很多,使用正則表達式就是比較經典的方法之一。我們先來看所採集網頁源碼的部分內容。
為了減少干擾,我先用正則表達式從整個頁面源碼中匹配出以上的主體部分,然後從主體部分中匹配出每隻股票的信息。代碼如下。
pattern=re.compile(‘tbody[\s\S]*/tbody’)
body=re.findall(pattern,str(content)) #匹配tbody和/tbody之間的所有代碼pattern=re.compile(‘(.*?)’)
stock_page=re.findall(pattern,body[0]) #匹配和之間的所有信息
其中compile方法為編譯匹配模式,findall方法用此匹配模式去匹配出所需信息,並以列表的方式返回。正則表達式的語法還挺多的,下面我只羅列所用到符號的含義。
語法 說明
. 匹配任意除換行符「\n」外的字符
* 匹配前一個字符0次或無限次
? 匹配前一個字符0次或一次
\s 空白字符:[空格\t\r\n\f\v]
\S 非空白字符:[^\s]
[…] 字符集,對應的位置可以是字符集中任意字符
(…) 被括起來的表達式將作為分組,裏面一般為我們所需提取的內容
正則表達式的語法挺多的,也許有大牛隻要一句正則表達式就可提取我想提取的內容。在提取股票主體部分代碼時發現有人用xpath表達式提取顯得更簡潔一些,看來頁面解析也有很長的一段路要走。
三、所得結果的整理
通過非貪婪模式(.*?)匹配和之間的所有數據,會匹配出一些空白字符出來,所以我們採用如下代碼把空白字符移除。
stock_last=stock_total[:] #stock_total:匹配出的股票數據for data in stock_total: #stock_last:整理後的股票數據
if data==”:
stock_last.remove(”)
最後,我們可以打印幾列數據看下效果,代碼如下
print(‘代碼’,’\t’,’簡稱’,’ ‘,’\t’,’最新價’,’\t’,’漲跌幅’,’\t’,’漲跌額’,’\t’,’5分鐘漲幅’)for i in range(0,len(stock_last),13): #網頁總共有13列數據
print(stock_last[i],’\t’,stock_last[i+1],’ ‘,’\t’,stock_last[i+2],’ ‘,’\t’,stock_last[i+3],’ ‘,’\t’,stock_last[i+4],’ ‘,’\t’,stock_last[i+5])
如何用Python爬取數據?
方法/步驟
在做爬取數據之前,你需要下載安裝兩個東西,一個是urllib,另外一個是python-docx。
請點擊輸入圖片描述
然後在python的編輯器中輸入import選項,提供這兩個庫的服務
請點擊輸入圖片描述
urllib主要負責抓取網頁的數據,單純的抓取網頁數據其實很簡單,輸入如圖所示的命令,後面帶鏈接即可。
請點擊輸入圖片描述
抓取下來了,還不算,必須要進行讀取,否則無效。
請點擊輸入圖片描述
5
接下來就是抓碼了,不轉碼是完成不了保存的,將讀取的函數read轉碼。再隨便標記一個比如XA。
請點擊輸入圖片描述
6
最後再輸入三句,第一句的意思是新建一個空白的word文檔。
第二句的意思是在文檔中添加正文段落,將變量XA抓取下來的東西導進去。
第三句的意思是保存文檔docx,名字在括號裏面。
請點擊輸入圖片描述
7
這個爬下來的是源代碼,如果還需要篩選的話需要自己去添加各種正則表達式。
python異步爬蟲例子
gevent是一個python的並發庫,它為各種並發和網絡相關的任務提供了整潔的API。
gevent中用到的主要模式是greenlet,它是以C擴展模塊形式接入Python的輕量級協程。 greenlet全部運行在主程序操作系統進程的內部,但它們被協作式地調度。
實戰
通過用gevent把異步訪問得到的數據提取出來。
在有道詞典搜索框輸入「hello」按回車。觀察數據請求情況觀察有道的url構建。
python爬蟲表格裏面的數據應該怎樣抓
貼一個例子你看,如何使用看文檔
import urllib2
from bs4 import BeautifulSoup
import csv
url = (‘;pos=college=’)
page = urllib2.urlopen(url).read()
soup = BeautifulSoup(page)
table = soup.find(‘table’)
f = csv.writer(open(“2000scrape.csv”, “w”))
f.writerow([“Name”, “Position”, “Height”, “Weight”, “40-yd”, “Bench”, “Vertical”, “Broad”, “Shuttle”, “3-Cone”])
# variable to check length of rows
x = (len(table.findAll(‘tr’)) – 1)
# set to run through x
for row in table.findAll(‘tr’)[1:x]:
col = row.findAll(‘td’)
name = col[1].getText()
position = col[3].getText()
height = col[4].getText()
weight = col[5].getText()
forty = col[7].getText()
bench = col[8].getText()
vertical = col[9].getText()
broad = col[10].getText()
shuttle = col[11].getText()
threecone = col[12].getText()
player = (name, position, height, weight, forty, bench, vertical, broad, shuttle, threecone, )
f.writerow(player)
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/309342.html