Python爬蟲實戰(zhàn):東方財富網(wǎng)股吧數(shù)據(jù)爬?。ㄒ唬?/a>
Python爬蟲實戰(zhàn):東方財富網(wǎng)股吧數(shù)據(jù)爬取(二)
Python爬蟲實戰(zhàn):東方財富網(wǎng)股吧數(shù)據(jù)爬取(三)
Python爬蟲實戰(zhàn):東方財富網(wǎng)股吧數(shù)據(jù)爬?。ㄋ模?/a>
Python爬蟲實戰(zhàn)系列文章目錄
前言
一、項目說明
二、實施過程
① 網(wǎng)頁源代碼
② 網(wǎng)頁鏈接
1.明確獲取網(wǎng)頁中哪些數(shù)據(jù)
2.查看網(wǎng)頁源代碼分析結(jié)構(gòu)
3.爬蟲需要具備的功能
4.爬取結(jié)果
總結(jié)
寫在最后
朋友托我寫個爬蟲,本身是個爬蟲小白的我還是接受了此次重任,總共歷時五天左右,過程中遇到過無數(shù)bug,好在一路披荊斬棘,還是大差不差的完成了此次委托!但感覺這次的經(jīng)歷還是有必要和大家分享一下,正好最近也沒有寫博文了,趁這次機會趕趕進度!
項目需求:股吧中人們的言論行為和股市漲跌的延遲相關(guān)性
數(shù)據(jù)來源:東方財富網(wǎng)、熱門個股吧
數(shù)據(jù)字段:閱讀、評論、標題、作者、更新時間
實現(xiàn)功能:讀取每個公司股吧的全部頁面的數(shù)據(jù)并寫入excel表中
以東方財富吧為例
我們需要爬取的是東方財富吧中全部發(fā)帖信息的閱讀、評論、標題、作者及最后更新時間這五個字段的數(shù)據(jù),我一開始想也不是很難,解析一下網(wǎng)頁匹配一下對應(yīng)的標簽值就可以了,但后面還是出現(xiàn)了各種各樣的問題,需要大家注意一下。
首先打開網(wǎng)頁的開發(fā)者工具(Ctrl+Shift+i),在源代碼中查找對應(yīng)字段的標簽結(jié)構(gòu)。
從圖中可以看出,這五個字段分別位于<span></span>
行標簽內(nèi),對應(yīng)的屬性分別是"l1 a1"、"l2 a2"、"l3 a3"、"l4 a4"、"l5 a5"
。想必大家已經(jīng)有思路了,我們可以通過先獲取網(wǎng)頁代碼,再解析網(wǎng)頁查詢對應(yīng)的五個字段,最后做一個提取就可以了。
【東方財富吧:300059】
首頁:https://guba.eastmoney.com/list,300059.html
第二頁:https://guba.eastmoney.com/list,300059_2.html
可以看出個股吧鏈接主要由三部分組成:list、名稱代碼、頁數(shù)
I.全部個股吧的數(shù)字代碼
如何得到不同股吧的所有翻頁數(shù)據(jù),著實讓我找了好久,各種資源我都找了可惜還是沒有發(fā)現(xiàn),突然無意之中我找到了解決辦法,我直接一個好家伙!
跟上述的五類字段一樣,我們查看一下頁數(shù)的代碼字段,如下圖所示:
<span></span>
標簽下的sumpage
屬性,其內(nèi)容即為總頁數(shù),本來以為原來這么好獲取,結(jié)果解析完才發(fā)現(xiàn),pagernums
里的內(nèi)容是動態(tài)的,即span.on
是會隨頁而變化的,故直接requests并不能獲取到,但是還是被我發(fā)現(xiàn)了玄機!data-pager
這里,里面的內(nèi)容是list,300059_|452885|80|2
,我對比了幾個頁面后發(fā)現(xiàn)其中數(shù)字分別代表的是:300059:股吧數(shù)字代碼452885:該股吧共發(fā)帖452885條 80:每個頁面分別有80條貼子 2:當前所處頁面為第2頁
那么這時候,我們就可以直接用累積多年的算力(小學除法)算出東方財富吧共有452885/80=5661.0625
,向上取整共5662
頁!如果你也脫口而出好家伙的話,請在屏幕下方打出來!
基本問題解決了,我們可以開始編寫爬蟲了。這部分不講代碼原理,只解釋代碼功能。自己也是小白,如果代碼存在問題或不清楚的話,歡迎大家在下方留言,我一定及時回復(fù)。
① 獲取網(wǎng)頁源代碼
def getHTMLText(url):try:r = requests.get(url, timeout=30)r.raise_for_status()r.encoding = r.apparent_encodingreturn r.textexcept:print("獲取網(wǎng)頁內(nèi)容失??!")
② 解析網(wǎng)頁并提取數(shù)據(jù)字段
def parsePage(html):list = [] # 我用的二維數(shù)組存儲read = []comment = []title = []author = []time = []try:# print(html)soup = BeautifulSoup(html, "html.parser")for each in soup.find_all('span', 'l1 a1'):if '萬' in each.string:each.string = each.string[:-2]read.append(each.string)read = read[1:] # read[0] == '閱讀'list.append(read)for each in soup.find_all('span', 'l2 a2'):comment.append(each.string)comment = comment[1:] # comment[0] == '評論'list.append(comment)for each in soup.find_all('span', 'l3 a3'):first = each.select('a:nth-of-type(1)')for i in first:i.find_all("a")# print(i.title)title.append(i.title)list.append(title)for each in soup.find_all('span', 'l4 a4'):first = each.select('font:nth-of-type(1)')for i in first:i.find_all("font")# print(i.title)author.append(i.title)list.append(author)for each in soup.find_all('span', 'l5 a5'):time.append(each.string)time = time[1:] # time[0] == '最后更新'list.append(time)except:print("解析網(wǎng)頁字段失??!")return list
③ 獲取貼吧總頁數(shù)
基于解析的網(wǎng)頁直接find_all也是可以的def get_total_pages_num(url):try:chrome_options = webdriver.ChromeOptions()chrome_options.add_argument('--headless')chrome_options.add_argument('lang=zh_CN.UTF-8')chrome_options.add_argument('User-Agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36"')chrome_options.add_argument('--disable-extensions')chrome_options.add_argument('--disable-gpu')chrome_options.add_argument('--no-sandbox')driver = webdriver.Chrome(options=chrome_options)driver.get(url)page_data = driver.find_element_by_xpath('//div[@id="mainbody"]/div[@id="articlelistnew"]/div[@class="pager"]/span[@class="pagernums"]').get_attribute('data-pager')# print(page_data)if page_data:# page_nums = re.findall('\|(\d+)', page_data[0])page_nums = page_data.split("|")# print(page_nums)total_pages = math.ceil(int(page_nums[1]) / int(page_nums[2]))driver.quit()except Exception as e:total_pages = 1return int(total_pages)
上述代碼基本的字段已經(jīng)可以實現(xiàn)爬取了,結(jié)果如下:
在爬取過程中,我還遇到了很多問題諸如:
① 部分帖子結(jié)構(gòu)不同或存在冗余該如何處理(問董秘等鏈接)
② 爬取過程中ip被屏蔽自動跳轉(zhuǎn)頁面該如何處理(代理IP池)
… …
這些內(nèi)容在后續(xù)章節(jié)中再和大家分享,下期再見啦!
聯(lián)系客服