一個月前實習導師布置任務說通過網路爬蟲獲取深圳市氣象局發布的降雨數據,網頁如下:
心想,爬蟲不太難的,當年跟zjb爬煎蛋網無(mei)聊(zi)圖的時候,多麼清高。由於接受任務後的一個月考試加作業一大堆,導師也不催,自己也不急。
但是,導師等我一個月都得讓我來寫意味著這東西得有多難吧。。。今天打開一看的確是這樣。網站是基於Ajax寫的,數據動態獲取,所以無法通過下載源代碼然後解析獲得。
從某不良少年寫的抓取淘寶mm的例子中收到啟發,對於這樣的情況,一般可以同構自己搭建瀏覽器實現。phantomJs,CasperJS都是不錯的選擇。
導師的要求是獲取過去一年內深圳每個區每個站點每小時的降雨量,執行該操作需要通過如上圖中的歷史查詢實現,即通過一個時間來查詢,而這個時間存放在一個hidden類型的input標簽里,當然可以通過js語句將其改為text類型,然後執行send_keys之類的操作。然而,我失敗了。時間可以修改設置,可是結果如下圖。
為此,僅抓取實時數據。選取python的selenium,模擬搭建瀏覽器,模擬人為的點擊等操作實現數據生成和獲取。selenium的一大優點就是能獲取網頁渲染後的源代碼,即執行操作後的源代碼。普通的通過 url解析網頁的方式只能獲取給定的數據,不能實現與用戶之間的交互。selenium通過獲取渲染後的網頁源碼,並通過豐富的查找工具,個人認為最好用的就是find_element_by_xpath("xxx"),通過該方式查找到元素後可執行點擊、輸入等事件,進而向伺服器發出請求,獲取所需的數據。
[python]view plain
#coding=utf-8
fromtestStringimport*
fromseleniumimportwebdriver
importstring
importos
fromselenium.webdriver.common.keysimportKeys
importtime
importsys
default_encoding='utf-8'
ifsys.getdefaultencoding()!=default_encoding:
reload(sys)
sys.setdefaultencoding(default_encoding)
district_navs=['nav2','nav1','nav3','nav4','nav5','nav6','nav7','nav8','nav9','nav10']
district_names=['福田區','羅湖區','南山區','鹽田區','寶安區','龍崗區','光明新區','坪山新區','龍華新區','大鵬新區']
flag=1
while(flag>0):
driver=webdriver.Chrome()
driver.get("hianCe/")
#選擇降雨量
driver.find_element_by_xpath("//span[@id='fenqu_H24R']").click()
filename=time.strftime("%Y%m%d%H%M",time.localtime(time.time()))+'.txt'
#創建文件
output_file=open(filename,'w')
#選擇行政區
foriinrange(len(district_navs)):
driver.find_element_by_xpath("//div[@id='"+district_navs[i]+"']").click()
#printdriver.page_source
timeElem=driver.find_element_by_id("time_shikuang")
#輸出時間和站點名
output_file.write(timeElem.text+',')
output_file.write(district_names[i]+',')
elems=driver.find_elements_by_xpath("//span[@onmouseover='javscript:changeTextOver(this)']")
#輸出每個站點的數據,格式為:站點名,一小時降雨量,當日累積降雨量
foreleminelems:
output_file.write(AMonitorRecord(elem.get_attribute("title"))+',')
output_file.write(' ')
output_file.close()
driver.close()
time.sleep(3600)
[python]view plain
#Encoding=utf-8
defOnlyCharNum(s,oth=''):
s2=s.lower()
fomart=',.'
forcins2:
ifnotcinfomart:
s=s.replace(c,'')
returns
defAMonitorRecord(str):
str=str.split(":")
returnstr[0]+","+OnlyCharNum(str[1])
B. python源程序執行的方法
具體如下:
在命令行輸入ipython或ipython3進入互動式shell環境;在命令行窗口輸入python【官方的shell】;集成開發環境,PyCharm類似IDEA。
Python由荷蘭數學和念桐計算機科學研究學會的GuidovanRossum於1990年代初設計,作為一門叫做ABC語言的替代品。Python提供了高效的高級數據結構,還能簡單有效地面向對象編程。Python語法和動態類型,以及解釋型語言的本質,使它成為多數平台上寫腳本和快速開發應用的編程語言,隨著版本的不斷更新和語言新功能的添加,逐漸被用於獨立的、大型項目的開發。Python解釋器易於擴展,可以使用C或C++(或者其他可以通過C調用的語言)擴展新的功能和數據類型。Python也可用於可定製化軟體中的擴展程序語言。Python豐富的標准庫,提供了適用於各個主要系租升統平台的源碼弊高老或機器碼。
C. Python源碼是什麼意思
源代碼是指原始代碼,可以是任何語言代碼。Python源碼就是指編寫的最原始程序的代碼。運行的軟體是要經過編寫的,程序員編寫程序的過程中需要他們的「語言」。
D. python源代碼程序文件擴展名
python源文件後綴是py。
以 py 擴展名的文件是 Python 源碼文件,由 python.exe 解釋,可在控制台下運行。可用文本編輯器讀寫。
Python中經常使用的文件後綴名:
pyc
以 pyc 為擴展名的是Python的編譯文件。其執行速度快於 py 文件且不能用文本編輯編輯查看。所以 pyc 文件往往代替 py 文件發布。
Python 在執行時,首先會將 py 文件中的源代碼編譯成 PyCodeObject 寫入 pyc 文件,再由虛擬機執行 PyCodeObject。
當 Python 執行 import 時會先尋找對應的 pyc或 pyd(dll)文件,如果沒有則將對應的py文件編譯寫入 pyc 文件。pyc文件也可以通過 python -m py_compile src.py 生成。
pyw
pyw 文件與 pyc 文件相似,但 pyw 執行的時候不會出控制台窗口。開發(純圖形界面程序)時可以暫時把 pyw 改成 py 以調出控制台窗口調試。
pyo
pyo 是優化編譯後的程序,不能用文本編輯器編輯。 python -O source.py 即可將源程序編譯為 pyo 文件。
pyd
pyd 一般是 Python 外的其他語言如 C/C++ 編寫的 Python 擴展模塊,即 Python 的一個動態連接庫,與 dll 文件相當。在Linux系統中一般為.so文件
E. 我現在想把自己寫的python模塊源代碼封裝成dll,然後在別的python腳本里調用,可以嗎
可以的,只要把python模塊轉換成dll模塊,利用Python自帶的ctypes模塊載入調用就行。
ctypes 是Python的外部函數庫。它提供了與 C語言兼容的數據類型,並允許調用 DLL 或共享庫中的函數。可使用該模塊以純 Python 形式對這些庫進行封裝。
ctypes導出了cdll對象,在 Windows 系統中還導出了windll和oledll對象用於載入動態鏈接庫。通過操作這些對象的屬性,你可以載入外部的動態鏈接庫。cdll載入按標準的cdecl調用協鋒滾議導出的函數,而windll導入的庫按stdcall調用協議調用其中的函數。
(5)pathon動態源碼擴展閱讀:
載入調用DLL的相關方法:
1、載入DLL銀扒余
載入的時候要根據你將要調用的函數是符合什麼調用約定的。
stdcall調用約定:兩種載入方式
Objdll = ctypes.windll.LoadLibrary("dllpath")
Objdll = ctypes.WinDLL("dllpath")
cdecl調用約定:也有兩種載入方式
Objdll = ctypes.cdll.LoadLibrary("dllpath")
Objdll = ctypes.CDLL("dllpath")
其實windll和cdll分別是WinDLL類和CDll類的對象。
2、調用dll中的方法
載入dll的時候會返回一個DLL對象(假設名字叫Objdll),利用該對象就可以調用dll中的方法。 e.g.如果dll中有個方法名字叫Add(注意如果經過stdcall聲明的方法,如果不是用def文件聲明的導出函數或者extern 「C」 聲明的話,編譯器會對函數名進行修此旦改,這個要注意。)
調用:nRet = Objdll.Add(12, 15) 即完成一次調用。
F. 《Python源碼剖析深度探索動態語言核心技術》pdf下載在線閱讀,求百度網盤雲資源
《Python源碼剖析》(陳儒)電子書網盤下載免費在線閱讀
資源鏈接:
鏈接:https://pan..com/s/1dtk-nY5HtgXS3CIBVHJCRA
書名:Python源碼剖析
作者:陳儒
豆瓣評分:8.8
出版社:電子工業出版社
出版年份:2008-6
頁數:480
內容簡介:
作為主流的動態語言,Python不僅簡單易學、移植性好,而且擁有強大豐富的庫的支持。此外,Python強大的可擴展性,讓開發人員既可以非常容易地利用C/C++編寫Python的擴展模塊,還能將Python嵌入到C/C++程序中,為自己的系統添加動態擴展和動態編程的能力。.
為了更好地利用Python語言,無論是使用Python語言本身,還是將Python與C/C++交互使用,深刻理解Python的運行原理都是非常重要的。本書以CPython為研究對象,在C代碼一級,深入細致地剖析了Python的實現。書中不僅包括了對大量Python內置對象的剖析,更將大量的篇幅用於對Python虛擬機及Python高級特性的剖析。通過此書,讀者能夠透徹地理解Python中的一般表達式、控制結構、異常機制、類機制、多線程機制、模塊的動態載入機制、內存管理機制等核心技術的運行原理,同時,本書所揭示的動態語言的核心技術對於理解其他動態語言,如 Javascript、Ruby等也有較大的參考價值。..
本書適合於Python程序員、動態語言愛好者、C程序員閱讀
G. python爬蟲 源碼
import os,requests
from bs4 import BeautifulSoup
headers ={
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0'
}
for i in range(105,200):
try:
url = 'https://pvp.qq.com/web201605/herodetail/' + str(i) +'.shtml'
response = requests.get(url,headers)
response.encoding = 'gbk'
soup = BeautifulSoup(response.text,'html.parser')
# skill_name = soup.find('p','skill-name')
# skill_desc = soup.find('p','skill-desc')
# print(skill_name.text)
# print(skill_desc.text)
name = soup.find("h2", "cover-name").text
# print(name)
story = soup.find('div', 'pop-bd').text
if story =='\n':
print("\n沒有【%d】%s的故事!"%(i,name))
else:
story_ = story.replace('。' ,'。\n' )
story_ = story.replace('\n' ,'\t>>>' )
print(story_[0:30]+"...")
# os.mkdir('C:\\Users\\Crystal\\Desktop\\英雄故事2')
# os.mkdir('C:\\Users\\28459\\Desktop\\測試\\')
os.chdir('C:\\Users\\28459\\Desktop\\測試\\')
open('%s'%name + '.txt' ,'w').write(story_)
print('【%d】%s的故事已保存!'%(i,name))
print()
except AttributeError:
print("\n沒有編號為%d的英雄!"%i)
H. 如何用python解析網頁並獲得網頁真實的源碼
可以去了解下python如何調用webkit的引擎,你說的那種不是用js加密,只是用js動態載入頁面內容。必須用webkit之類的瀏覽器引擎去渲染。