一個同學(xué)要做畢業(yè)設(shè)計(jì),需要馬蜂窩網(wǎng)上關(guān)于臺灣省的全部點(diǎn)評游記,正好很久沒寫這種小爬蟲了,來練練手。
馬蜂窩的游記可以在兩個地方找到,一個是直接在首頁上:http://www.mafengwo.cn/。

另外一個是:http://www.mafengwo.cn/yj/12684/

不同的是首頁上會多一點(diǎn),有250頁,而第二種只有50頁。當(dāng)然選擇第一種。
首先觀察首頁上的關(guān)于臺灣的熱門游記,1,2,3,4翻下來之后發(fā)現(xiàn)網(wǎng)址不會變,肯定是ajax了。F12,network之后開始找網(wǎng)址吧。
這里要著重提一下的是這次遇到的一個問題。
http://www.mafengwo.cn/note/pagelet/pagelet/recommendNoteApi?callback=jQuery18106049210270286689_1500622287438¶ms=%7B%22type%22%3A0%2C%22objid%22%3A0%2C%22page%22%3A11%2C%22ajax%22%3A1%2C%22retina%22%3A1%7D&_=1500622917079
這是找到的真實(shí)網(wǎng)址,返回的是json

第一次找的時(shí)候我看了一眼就跳過了,后來問了一個朋友才知道,這是網(wǎng)頁中為了加快加載速度的一種方式,將鼠標(biāo)放上去后,就可以看到它返回的東西了。這一點(diǎn)搞明白就簡單了。將其中返回的網(wǎng)頁后續(xù)取出,裝上baseurl就是每一篇游記的地址了。如下:
data2= re.findall(".*jQuery1810367880419551615_1500604060808\((.*?}})\);",data)[0]
data3 = json.loads(data2)
next_page =data3['data']['html']
html = etree.HTML(next_page)
infos = html.xpath('//div[@class="tn-image"]/a')
for info in infos:
link=info.xpath('@href')[0]
all_link.append('http://www.mafengwo.cn/'+link)
最后在回到找到的網(wǎng)址,觀察后面的params=%7B%22type%22%3A0%2C%22objid%22%3A0%2C%22page%22%3A11%2C%22ajax%22%3A1%2C%22retina%22%3A1%7D,有很多參數(shù)都是在下面可以找到的,其他都是不變的,只有page在變的。
page%22%3A11%2C%22,但是有很多數(shù)字,符號。多翻幾頁之后就可以明白是在3A~%2C之間的數(shù)字才是真的填寫地點(diǎn)。
后續(xù)的就簡單很多了。