艾瑪花盐,補(bǔ)作業(yè)啊補(bǔ)作業(yè)。迫不及待的進(jìn)入到爬數(shù)據(jù)階段菇爪,這時(shí)候真的是發(fā)現(xiàn)條條大路通羅馬算芯,想抓個(gè)數(shù)據(jù)方法是在是太多了。第一個(gè)簡(jiǎn)單的爬蟲(chóng)折騰了一個(gè)下午凳宙,Mark一下熙揍。
作業(yè)題目:
爬取糗百 http://www.qiushibaike.com/text/
包括:作者,性別氏涩,年齡届囚,段子內(nèi)容有梆,好笑數(shù),評(píng)論數(shù)
對(duì)于一個(gè)爬蟲(chóng)來(lái)說(shuō)意系,我們先理解清楚最小系統(tǒng):
- Url管理器
- HTML下載器
- HTML解析器
1.URL管理器比較好理解泥耀,頁(yè)面中存在鏈接套鏈接,只有這樣我們的小爬蟲(chóng)才能發(fā)揮巨大作用蛔添,我們需要把所有的url進(jìn)行管理痰催,去除重復(fù)的url,還有一些高階提高效率的功能迎瞧。
2.HTML下載器夸溶,大約就是模擬瀏覽器去請(qǐng)求需要訪問(wèn)的頁(yè)面,存放在本地凶硅。
3.HTML解析器缝裁,就是把請(qǐng)求下來(lái)的HTML數(shù)據(jù)進(jìn)行分析,獲取自己想要的有效數(shù)據(jù)咏尝。
OK压语,大約就是這個(gè)套路,開(kāi)始爬坑~~~
老規(guī)矩编检,直接上代碼:
import urllib2
import bs4
from bs4 import BeautifulSoup
url = 'http://www.qiushibaike.com'
user_agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
headers = {'User-Agent':user_agent}
#enter headers
request = urllib2.Request(url, headers=headers)
response = urllib2.urlopen(request).read()
# print response.decode('utf-8').encode('gbk')
#create beautiful soap object
soup = BeautifulSoup(response, 'lxml')
for link in soup.find_all('div', class_='article block untagged mb15'):
#
print 'author : %s'%link.find('h2').text
# print 'gender : %s'%link.select('.articleGender')
# <div class="articleGender womenIcon">22</div>
print 'age : %s'%link.find('div',class_='articleGender').text
#fun number
print 'fun number : %s'%link.select('div.stats > span.stats-vote > i')[0].text
# comments num
print 'comments num : %s'%link.select('div.stats > span.stats-comments > a > i')[0].text
# content
print 'content : %s \n'%link.select('a > div.content > span')[0].text
小白就是小白胎食,一開(kāi)始報(bào)這個(gè)錯(cuò):
我天真的不把url帶協(xié)議頭,就丟到了
urllib2.request()
當(dāng)中去了允懂,記得要帶著http://
下面這個(gè)問(wèn)題厕怜,貌似是比較常見(jiàn)的,我請(qǐng)求baidu的時(shí)候沒(méi)有個(gè)問(wèn)題蕾总,但是糗百就不行粥航。還是得偽裝一下,各種網(wǎng)站都應(yīng)該會(huì)防止這樣的爬數(shù)據(jù)行為生百,所以以后的hack行為還是得高級(jí)一些递雀。
user_agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
headers = {'User-Agent':user_agent}
再來(lái)就是顯示中文亂碼問(wèn)題,電腦開(kāi)不動(dòng)虛擬機(jī)了蚀浆,又買不起MAC缀程。win做開(kāi)發(fā)真的不喜歡。
print response.decode('utf-8').encode('gbk')
#來(lái)回倒一下編碼方式咯市俊,費(fèi)勁的很
關(guān)鍵的地方就是解析這下載下來(lái)的HTML內(nèi)容杨凑,BS4就是利用DOM的結(jié)構(gòu),一層層的剝開(kāi)摆昧,找到有效數(shù)據(jù)的規(guī)律撩满。
soup = BeautifulSoup(response, 'lxml')
for link in soup.find_all('div', class_='article block untagged mb15'):
#
print 'author : %s'%link.find('h2').text
# print 'gender : %s'%link.select('.articleGender')
# <div class="articleGender womenIcon">22</div>
print 'age : %s'%link.find('div',class_='articleGender').text
#fun number
print 'fun number : %s'%link.select('div.stats > span.stats-vote > i')[0].text
# comments num
print 'comments num : %s'%link.select('div.stats > span.stats-comments > a > i')[0].text
# content
print 'content : %s \n'%link.select('a > div.content > span')[0].text
這個(gè)里面各種小技巧,針對(duì)不同的特點(diǎn)的數(shù)據(jù)使用不同判斷方法,思路就是找出規(guī)律定位數(shù)據(jù)伺帘。
總結(jié)一下
啊~~~~真心不容易昭躺,總的來(lái)說(shuō),還是利用Beautiful Soup4把一些基礎(chǔ)的數(shù)據(jù)爬出來(lái)的曼追。但是也僅限于了解最基本的原理窍仰。后面還有很多的路要走。
明天還有一天休息礼殊,真心謝謝屈原(其實(shí)叫羋原驹吮,楚國(guó)人大多都是姓這個(gè))
明天打算把爬簡(jiǎn)書(shū)的任務(wù)做了,學(xué)一些正則晶伦,用一下Xpath碟狞。
另外還有最好把代碼重構(gòu)為面向?qū)ο蟮姆绞健T T婚陪,好多事情族沃,加油啦。