python動態url
① url編碼問題在python中怎麼解決
最近在抓取一些js代碼產生的動態數據,需要模擬js請求獲得所需用的數據,遇到對url進行編碼和解碼的問題,就把遇到的問題總結一下,有總結才有進步,才能使學到的知識更加清晰。對url進行編碼和解碼,python提供了很方便的介面進行調用。
url中的query帶有特殊字元(不是url的保留字)時需要進行編碼。當url中帶有漢字時,需要特殊的處理才能正確編碼,以下都只針對這種情形,當然也適用於純英文字元的url。
(1) url編碼:
import urllib
url = 'wd=哈哈' #如果此網站編碼是gbk的話,需要進行解碼,從gbk解碼成unicode,再從Unicode編碼編碼為utf-8格式。
url = url.decode('gbk', 'replace')
print urllib.quote(url.encode('utf-8', 'replace'))
結果: 3a%2f%2ftest.com%2fs%3fwd%3d%e5%93%88%e5%93%88
(2) url解碼:
import urllib
encoded_url = est.com%2fs%3fwd%3d%e5%93%88%e5%93%88'
print urllib.unquote(encoded_url).decode('utf-8', 'replace').encode('gbk', 'replace') #反過來
函數調用的參數以及結果都是utf-8編碼的,所以在對url編碼時,需要將參數串的編碼從原始編碼轉換成utf-8,
對url解碼時,需要將解碼結果從utf-8轉換成原始編碼格式。
依據網站採用的編碼不同,或是gbk或是utf-8,賦賦予不同的編碼,進行不同的url轉碼。GBK格式,一個中文字元轉為%xx%xx,共兩組;utf-8格式,一個中文字元轉為%xx%xx%xx,共三組。
>>>importsys,urllib
>>>s='杭州'
>>>urllib.quote(s.decode(sys.stdin.encoding).encode('gbk'))
%BA%BC%D6%DD
>>>urllib.quote(s.decode(sys.stdin.encoding).encode('utf8'))
'%E6%9D%AD%E5%B7%9E'
a="墨西哥女孩被拐4年接客4萬次生的孩子成為人質-搜狐新聞"
printurllib.quote(urllib.quote(a))
[python]view plain
進行兩次編碼轉換後,會變為:%25E5%25A2%25A8%25E8%25A5%25BF%25E5%2593%25A5%25E5%25A5%25B3%25E5%25AD%25A9%25E8%25A2%25AB%25E6%258B%25904%25E5%25B9.................................................................................這樣的形式。
同樣需要兩次解碼後才能得到中文。
最近用python寫了個小爬蟲自動下點東西,但是url 是含中文的,而且中文似乎是 gbk 編碼然後轉成 url的。舉個例子吧,我如果有個unicode字元串「歷史上那些牛人們.pdf」,那麼我轉換成url之後是,
t="%20%E5%8E%86%E5%8F%B2%E4%B8%8A%E9%82%A3%E4%BA%9B%E7%89%9B%E4%BA%BA%E4%BB%AC.pdf",
但是對方網站給的是 s="%C0%FA%CA%B7%C9%CF%C4%C7%D0%A9%C5%A3%C8%CB%C3%C7.PDF"
>>>print urllib.unquote("%C0%FA%CA%B7%C9%CF%C4%C7%D0%A9%C5%A3%C8%CB%C3%C7.PDF").decode('gbk').encode('utf-8')
>>>歷史上那些牛人們.PDF
② python怎麼獲取動態網頁鏈接
四中方法:
'''
得到當前頁面所有連接
'''
import requests
import re
from bs4 import BeautifulSoup
from lxml import etree
from selenium import webdriver
url = 'http://www.ok226.com'
r = requests.get(url)
r.encoding = 'gb2312'
# 利用 re
matchs = re.findall(r"(?<=href=\").+?(?=\")|(?<=href=\').+?(?=\')" , r.text)
for link in matchs:
print(link)
print()
# 利用 BeautifulSoup4 (DOM樹)
soup = BeautifulSoup(r.text,'lxml')
for a in soup.find_all('a'):
link = a['href']
print(link)
print()
# 利用 lxml.etree (XPath)
tree = etree.HTML(r.text)
for link in tree.xpath("//@href"):
print(link)
print()
# 利用selenium(要開瀏覽器!)
driver = webdriver.Firefox()
driver.get(url)
for link in driver.find_elements_by_tag_name("a"):
print(link.get_attribute("href"))
driver.close()
③ 如何用python爬取網頁中隱藏的div內容
你說的隱藏的div內容,應該是動態載入的數據吧,不在網頁源碼中顯示,只在載入網頁時才請求數據進行顯示,一般情況下,這種數據都保存在一個json文件中,只要抓包分析出這個json文件的url地址,然後再根據json文件結構進行解析,很快就能獲取到動態載入的div數據,下面我以爬取人人貸上面的散標數據為例,簡單介紹一下python如何爬蘆枝取div動態載入的數據,實驗環境win10+python3.6+pycharm5.0,主要步驟如下:
1.首先,打開散標數族咐據,如下,爬取的信息主要包括年利率、借款標題、期限、金額和進度這5個欄位信息:
右鍵對應元素進行檢查,可以看出所有的數據嵌套在div標簽中,如下:
打開網頁源碼,我們按Ctrl+F查找對應的數據,會發現所查找的數據都未在網頁源碼中,如下,即數據都是動態載入,所以直接解析原網頁是找不到div嵌套的數據的:
2.接著,我們按F12調出開發者工具,依次點擊「Network」->「XHR」,F5刷新頁面,就會看到動態載入的json文件,查看這個文件,內容如下,左邊為json文件的url地址,右邊就是我們需要爬取的div數據:
3.最後對應上面的json文件,我們就可以直接獲取並解析json了,這里主要用到requests和json這2個模塊,其中requests用於根據url地址獲取json文件,json用於解析json文件,提取出我們所需要的信息,即div動態載入的數據,測試代碼如下,非常簡單:
運行程序,截圖如下,已經成功爬取到div載入的數據:
至此,我們就完成了利用python爬取div動態載入的數據。總的來說,整個過程非常簡單,最主要的陪穗敏還是抓包分析,只要你有一定的爬蟲基礎,熟悉一下上面的代碼,多調試幾遍程序,很快就能掌握的,當然,你也可以使用selenium進行爬取,直接解析就行,網上也有相關教程和資料可供參考,非常豐富,希望以上分享的內容能對你有所幫助吧,也歡迎大家評論、留言。
④ 如何用Python爬取動態載入的網頁數據
動態網頁抓取都是典型的辦法
直接查看動態網頁的載入規則。如果是ajax,則將ajax請求找出來給python。 如果是js去處後生成的URL。就要閱讀JS,搞清楚規則。再讓python生成URL。這就是常用辦法
辦法2,使用python調用webkit內核的,IE內核,或者是firefox內核的瀏覽器。然後將瀏覽結果保存下來。通常可以使用瀏覽器測試框架。它們內置了這些功能
辦法3,通過http proxy,抓取內容並進行組裝。甚至可以嵌入自己的js腳本進行hook. 這個方法通常用於系統的反向工程軟體
⑤ 【壹】Python爬蟲入門——認識URL
【系列前言】前段時間李響同學入門了一些Python的基礎知識,覺得一直在IDLE里print一些演算法題有一些枯燥,所以決定通過學習爬蟲來提高自己的興趣。而且最近確實有一些重復性勞動,想使用爬蟲簡化工作。遂打算邊自學邊寫自己自學的過程,一方面作為小白的我可以和其他Python大神交流,一方面也可以以此監督自己。
【本人使用Python版本:2.7.5】
首先按理解一下爬蟲(Spider),如果把一個站點比作一張縱橫交錯的蜘蛛網,那麼我們爬蟲要做的就是在這張網上爬來爬去,獲得這張網上的信息和資源。而Web上每種資源,比如HTML文檔、圖片、視頻等都由一個URI(Universal Resource Identifier,通用資源標志符)進行定位。 URL(Uniform Resource Locator,統一資源定位符)是URI的子集。採用URL可以用一種統一的格式來描述各種信息資源,包括文件、伺服器的地址和目錄等。而爬蟲主要的處理對象就是URL。所以務必要對URL有一定的熟悉。
URI通常由三部分組成:
1.訪問資源的命名機制;
2.存放資源的主機名;
3.資源自身 的名稱,由路徑表示。
URL的格式由三部分組成:
1.第一部分是協議(或稱為服務方式)。
2.第二部分是存有該資源的主機IP地址(有時也包括埠號)。
3.第三部分是主機資源的具體地址,如目錄和文件名等。
知乎:HTTP 協議中 URI 和 URL 有什麼區別?@西毒 的回答
最近在搞挑戰杯可能會有點忙,但還是希望自己能按照計劃學習,定期更新此系列。
⑥ python指定url
今天簡單使用了一下python的re模塊和lxml模塊,分別利用的它們提供的正則表達式和xpath來解析頁面源碼從中提取所需的title,xpath在完成這樣的小任務上效率非常好,在這里之所以又使用了一下正則表達式是因為xpath在處理一些特殊的頁面的時候會出現亂碼的情況,當然這不是xpath的原因,而是頁面本身編碼,跟utf-8轉碼之間有沖突所致,這里看代碼:
python抽取指定url頁面的title方法(python獲取當前頁面的url) python 抽取 url title 腳本之家 第1張
# !/usr/bin/python
#-*-coding:utf-8-*-
'''
功能:抽取指定url的頁面內容中的title
'''
import re
import chardet
import urllib
from lxml import etree
def utf8_transfer(strs):
'''
utf8編碼轉換
'''
try:
if isinstance(strs, unicode):
strs = strs.encode('utf-8')
elif chardet.detect(strs)['encoding'] == 'GB2312':
strs = strs.decode("gb2312", 'ignore').encode('utf-8')
elif chardet.detect(strs)['encoding'] == 'utf-8':
strs = strs.decode('utf-8', 'ignore').encode('utf-8')
except Exception, e:
print 'utf8_transfer error', strs, e
return strs
def get_title_xpath(Html):
'''
用xpath抽取網頁Title
'''
Html = utf8_transfer(Html)
Html_encoding = chardet.detect(Html)['encoding']
page = etree.HTML(Html, parser=etree.HTMLParser(encoding=Html_encoding
⑦ 從零開始學Python-使用Selenium抓取動態網頁數據
AJAX(Asynchronouse JavaScript And XML:非同步JavaScript和XML)通過在後台與伺服器進行少量數據交換,Ajax 可以使網頁實現非同步更新,這意味著可以在不重帶洞新載入整個網頁的情況下,對網頁的某部分進行局部更新。傳統的網頁(不使用Ajax)如果需要更新內容,必蠢者枯須重載整個網頁頁面。
因為傳統的網頁在傳輸數據格式方面,使用的是 XML 語法,因此叫做 AJAX ,其實現在數據交互基本上都是使用 JSON 。使用AJAX載入的數據,即使使用了JS將數據渲染到了瀏覽器中,在 右鍵->查看網頁源代碼 還是不能看到通嫌隱過ajax載入的數據,只能看到使用這個url載入的html代碼。
法1:直接分析ajax調用的介面。然後通過代碼請求這個介面。
法2:使用Selenium+chromedriver模擬瀏覽器行為獲取數據。
Selenium 相當於是一個機器人。可以模擬人類在瀏覽器上的一些行為,自動處理瀏覽器上的一些行為,比如點擊,填充數據,刪除cookie等。 chromedriver 是一個驅動 Chrome 瀏覽器的驅動程序,使用他才可以驅動瀏覽器。當然針對不同的瀏覽器有不同的driver。以下列出了不同瀏覽器及其對應的driver:
現在以一個簡單的獲取網路首頁的例子來講下 Selenium 和 chromedriver 如何快速入門:
參考:Selenium的使用
直接直接分析ajax調用的介面爬取
selenium結合lxml爬取