背景:領(lǐng)導(dǎo)讓統(tǒng)計(jì)點(diǎn)東西诗茎,之前一個(gè)頁(yè)面的都用JS操作的工坊,這次不行了:要跳2個(gè)頁(yè)面才能獲取到數(shù)據(jù)(我的思路是先從第一個(gè)頁(yè)面獲取所有超鏈接放到一個(gè)數(shù)組里,然后循環(huán)遍歷敢订,取第二個(gè)頁(yè)面里的數(shù)據(jù))王污。然后決定用剛學(xué)的PYTHON上手。(其實(shí)我這個(gè)整體思路就錯(cuò)了楚午,應(yīng)該直接通過(guò)接口取數(shù)據(jù)昭齐;而不是通過(guò)頁(yè)面URL;因?yàn)閁RL有可能是動(dòng)態(tài)生成的數(shù)據(jù)矾柜,就算獲取到了url解析出來(lái)了阱驾,數(shù)據(jù)也是不全的...但也算加深學(xué)習(xí)python了)
思路:首先就是把請(qǐng)求頭(包括cookie)放在header里登錄網(wǎng)頁(yè)。第二步是獲取A標(biāo)簽怪蔑。
from bs4
import BeautifulSoup
from urllib import request
import urllib.request
import chardet
import zlib
import requests
#1 數(shù)據(jù)url
url ="https://gxxxx.xxxx.cn/xxxxx"
#2 添加請(qǐng)求頭
header = {
? ? "method":"POST",
? ? "accept":"application/json, text/plain, */*",
? ? "accept-encoding":"gzip, deflate, br",
? ? "accept-language":"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
? ? "content-type":"application/json;charset=UTF-8",
? ? "cookie":"xxxxxxxxxxxxxxxxxxx",
}
#3 構(gòu)建請(qǐng)求對(duì)象
request = urllib.request.Request(url, headers=header)
#4 發(fā)送請(qǐng)求對(duì)象
response = urllib.request.urlopen(request)
#5 讀取并解析GZIP格式的頁(yè)面(這里踩過(guò)坑里覆,一開(kāi)始解析出是都是亂碼;后來(lái)知道是因?yàn)間zip格式導(dǎo)致的缆瓣;處理方式如下)
data = zlib.decompress(response.read(), 16+zlib.MAX_WBITS)
#打印data
print(data)
#調(diào)試打印解析出的文件的格式是什么
print (chardet.detect(data).get('encoding'))
soup = BeautifulSoup(data, 'html.parser', from_encoding='iso-8859-1')
print(soup.decode('UTF-8'))
# 找出所有的 a 標(biāo)簽喧枷, 因?yàn)樗械逆溄佣荚?a 標(biāo)簽內(nèi)
data = soup.find_all('a')
# 打開(kāi)文件對(duì)象做持久化操作
file =open('D:/link.txt', mode='w', encoding='UTF-8')
# 遍歷所有的 a 標(biāo)簽, 獲取它們的 href 屬性的值和它們的text
for itemin data:
if item.stringis not None and item['href'] !='javascript:;' and item['href'] !='#':
print(item.string, item.get('href'))
file.write(str.__add__(item.string, ' '))
file.write(str.__add__(item['href'], '\n'))
踩了3個(gè)坑:
1.一個(gè)是read源網(wǎng)頁(yè)后弓坞,發(fā)現(xiàn)都是亂碼隧甚;然后發(fā)現(xiàn)是gzip格式導(dǎo)致的;然后導(dǎo)入python的zlib庫(kù)解決的渡冻。
然后還百度了--->打印解析出的文件的格式的指令:#print (chardet.detect(html).get('encoding'))
2.最開(kāi)始寫(xiě)得那版戚扳,其實(shí)沒(méi)有read,其實(shí)也是運(yùn)行成功了的族吻;但是我看著返回結(jié)果不太對(duì)咖城,就又去read了一下源文件。然后出現(xiàn)了上述亂碼問(wèn)題呼奢。
第一版代碼:
第二版代碼:
3.成功解析出源碼后,發(fā)現(xiàn)比源HTML少了好多數(shù)據(jù)切平。一查握础,發(fā)現(xiàn)有些數(shù)據(jù)是js后期加載生成的.....也就是說(shuō)我這些都白寫(xiě)了。
參考文章:
用python代碼模擬登錄網(wǎng)站https://www.cnblogs.com/lanyincao/p/10745474.html
python來(lái)獲取網(wǎng)頁(yè)中的所有鏈接https://www.cnblogs.com/li1234567980/p/12846077.html
在python中使用urllib2.urlopen獲取的html網(wǎng)頁(yè)不完整https://segmentfault.com/q/1010000007513722