出門旅行沒規劃?python抓取馬蜂窩自由行攻略!
本來想搞個簡單的網站沒去搞攜程啥的抓個馬蜂窩玩玩,沒想到馬蜂窩也不是那麼容易搞(T ^ T)
對於新手來講寫爬蟲最重要的一點就是要確定目標,知道自己要抓什麼!
身為小白學完爬蟲基礎就想找東西練手,結果滿腦子想到的都是一些大網站 京東,淘寶,攜程等等········
難的自己還搞不定,小網站還沒意思,我也很無奈 (有木有大佬推薦下好玩的網站我好練練手)
今天的目標是馬蜂窩北京自由行攻略,有了目標咱們就開始干吧!
1.分析馬蜂窩的url,列表頁翻頁url沒變化,查看html 翻頁鏈接里還沒路徑,當時看了想吐血噗·····(*-`ω′-)人
2.無奈抓包慢慢找其他介面,找到了json介面裡面存著html,就一個參數也很好分析
3.然後就簡單了循環發請求拿標題鏈接去解析詳情頁
4.詳情頁的內容是放在不同div下 還要循環把所有內容抓到再拼接成一個字元串,稍微麻煩點
5.測試的時候發現有的文章是沒作者沒簡介的,要判斷一下如果抓到空 作者就賦值個匿名
6.存儲的時候我用標題做的文件名TXT格式,又出現文件名有非法字元串的錯誤,百度了一段代碼,賊雞兒好用!
res = r"[/\:*?"<>|]"
title = re.sub(res, "_", title)
最後上代碼:
import requestsfrom bs4 import BeautifulSoupimport jsonimport reimport osheaders = { "Host" : "www.mafengwo.cn", "Connection" : "keep-alive", "Pragma" : "no-cache", "Cache-Control" : "no-cache", "Accept" : "*/*", "X-Requested-With" : "XMLHttpRequest", "User-Agent" : "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", "Referer" : "http://www.mafengwo.cn/gonglve/ziyouxing/mdd_10065/", "Accept-Language" : "en,zh-CN;q=0.8,zh;q=0.6",}#發送請求def getpage(): os.mkdir(./mafengwo) base_url = http://www.mafengwo.cn/gonglve/ziyouxing/list/list_page?mddid=10065&page=1 response = requests.get(base_url,headers=headers) json_html = json.loads(response.text) #提取html內容 html = json_html["html"] # print(html) html = BeautifulSoup(html,lxml) #獲取最大頁數 max_page = html.select(span.count)[0].text #用正則把頁數從字元串中抽取出來 pattern = re.compile(rd+) res = pattern.search(max_page) max_number = res.group() #循環發送請求獲取所有列表頁 for i in range(1,int(max_number)+1): base_url = http://www.mafengwo.cn/gonglve/ziyouxing/list/list_page?mddid=10065&page=%d response = requests.get(base_url % i,headers=headers) print(正在抓取第%s頁 % i) json_html = json.loads(response.text) html = json_html["html"] html = BeautifulSoup(html, lxml) #獲取詳情頁鏈接 list_link = html.select(a._j_item) for link in list_link: info = link.get(href) #網頁用的相對路徑所以要拼接一下 info_link = http://www.mafengwo.cn + info # print(info_link) details_page(info_link)# 解析詳情頁def details_page(info_link): response = requests.get(info_link,headers=headers) html = BeautifulSoup(response.text,lxml) title = html.select(div.l-topic h1)[0].text #標題 name = html.select(span.name) #作者 #作者有的是空的 要判斷一下 if name == []: name = 匿名 else: name = name[0].text.strip() brief = html.select(div.l-topic > p) #簡介 if brief == []: brief = 無簡介 else: brief = brief[0].text.strip() content_list = html.select(div.f-block) #內容列表 #加換行為了好看而已 text = [
] #循環內容列表把左右空格去掉 再用換行拼接成字元串 for i in content_list: centent = i.text.strip() #獲取內容文字 text.append(centent) content_text =
.join(text) img_list = html.select(img._j_lazyload) #圖片列表 img = [
] for n in img_list: src = n.get(data-rt-src) #獲取圖片路徑 img.append(src) img_src =
.join(img) #去除名字中的非法字元 res = r"[/\:*?"<>|]" # / : * ? " < > | title = re.sub(res, "_", title) # 替換為下劃線 # print(title,name,brief,content_text,img_src) item = { title: title, name: name, brief:
+ brief, content_text: content_text, img_src: img_src, } storage(item)#存儲函數def storage(item): # 以文章標題命名存成TXT with open(./mafengwo/ + item[title] + .txt,w,encoding = utf-8) as f: txt_list = [] txt_list.append(.join([item[title], item[name],item[brief],item[content_text],item[img_src]])) f.writelines(txt_list)if __name__ == __main__: getpage()
有沒有大佬給我重構下代碼,感覺寫的太丑了┐( ̄ヮ ̄)┌
推薦閱讀:
※Python Selenium Webdriver環境準備 2
※馬哥培訓,無恥的抄襲。
※批量看妹子——你的第一個知乎爬蟲(1)
※chapter 14 - 應用編程介面(API)
※PHP 匿名函數實現Python 一樣的功能。