本文連結:https://blog.csdn.net/qq_36807888/article/details/111603563
元旦快要來了就意味著假期快要來了。有沒有計劃好元旦去哪裡散心呢?
今天就用爬蟲帶你分析以下國內最熱門城市哪些值得你去~
首先我們的目標網站是窮遊網。
https://place.qyer.com/china/citylist-0-0-1/
我們要抓取的資料是這些熱門城市的名稱、排行榜、旅遊人次和旅遊景點。
老規矩,爬蟲四部曲:
1.找爬蟲所在url地址(系統性的網頁分析)
2.傳送網路請求
3.資料解析(我們所需資料)
4.儲存資料
1.找爬蟲所在url地址(系統性的網頁分析)
首先我們來分析網頁屬於動態載入還是靜態載入。教你一招最簡單的辦法。
如上圖找到瀏覽器設定,禁止javascript載入,如果網頁還如先前一般正常顯示。即說明該網頁屬於靜態載入。
2.咱們今天要分析的網站就屬於一個靜態載入。所以目標url就可以確定下來,即瀏覽器導航欄地址
url= https://place.qyer.com/china/citylist-0-0-1/
3.偽裝成瀏覽器傳送請求。為了防止網站反爬,我們需要對爬蟲程式碼進行偽裝,開啟瀏覽器開發者模式可以看到網站傳送請求時會攜帶這麼多的引數。這裡我們只需refer、user-agent(瀏覽器身份)進行偽裝即可。
4.傳送網路請求,需要資料請求模組requests模擬瀏覽器傳送網路請求。
#m模擬瀏覽器傳送網路請求
resp = requests.get(url, headers = headers)html_data = resp.textprint(html_data)
返回的結果其實和我們在瀏覽器裡面看到的其實是一樣的。
5.資料的解析,開啟瀏覽器的開發者模式發現這些城市的資訊都位於一個個li元素標籤中。也就是說一個li元素內就是一個城市的資訊。而所有的li元素又都在一個叫做ul的父標籤之內。
所以我們首先要提取到ul這個父標籤的位置。
6.我們可以看到ul所在位置有一個class = 'plcCitylist'的屬性。
lis= selector.xpath('//ul[@class = "plcCitylist"]/li')
7.獲取到了所有li的位置之後我們就可以迴圈獲取li標籤裡面的城市資訊了。
forliinlis:city_name = li.xpath('h3/a/text()').get()
#城市名稱print(city_name)#
香港 澳門 臺北 臺灣 北京 上海 成都 廣州 南京 杭州 廈門 深圳 重慶 三亞 珠海
8.同樣方法我們可以獲取到城市名稱、旅遊人數、熱門景點、城市圖片和城市詳情等情況。
travel_name = li.xpath('h3/a/text()').get()#城市名稱
travel_no = li.xpath('p[2]/text()').get()#旅遊人數
travel_hot = li.xpath('.//p[@class = "pois"]/a/text()').getall()#熱門城市
travel_hot = [hot.strip()forhotintravel_hot]
travel_hot ='、'.join(travel_hot)#join()合併列表物件
travel_url = li.xpath('h3/a/@href').get()#城市詳情頁面地址
travel_img = li.xpath('p/a/img/@src').get()#城市封面圖片
結果列印如下:
香港 | 338157人去過 | 香港海洋公園、星光大道、維多利亞港、太平山、尖沙咀、金紫荊廣場、香港迪士尼樂園、中環、彌敦道、蘭桂坊、中銀大廈、香港杜莎夫人蠟像館、中環至半山自動扶梯、旺角、灣仔、黃大仙祠、銅鑼灣、廟街、凌霄閣、重慶大廈 | //place.qyer.com/hong-kong/ | https://pic.qyer.com/album/user/213/10/Q0hWQxoGYg/index/cover
澳門| 199621人去過 |澳門大三巴牌坊、大炮臺、議事亭前地、玫瑰堂、官也街、媽閣廟、氹仔島、澳門漁人碼頭、民政總署大樓、澳門威尼斯人、大三巴街、澳門博物館、金蓮花廣場、崗頂前地、瑪嘉烈蛋撻店、澳門旅遊塔、龍環葡韻住宅式博物館、東望洋炮臺、聖若瑟修院及聖堂、黑沙海灘| //place.qyer.com/macau/ |https://pic.qyer.com/album/user/1015/77/QElURx0AZE8/index/cover
9.最後一步就是我們的資料儲存了,我們需要匯入python自帶csv模組。然後將所有我們獲取到的資料儲存在 '窮遊網資料.csv' 檔案中
withopen('窮遊網資料.csv',mode='a',encoding='utf-8',newline='')asf:
csv_write = csv.writer(f)
csv_write.writerow([travel_name,travel_no,travel_hot, travel_url, travel_img])
來看列印結果:
窮遊網資料.csv:
10.第一頁的資料我們現在已經完美地儲存下來了,接下來我們要獲取剩下的170頁資料。我們先來檢視位址列url規律
第1頁:https://place.qyer.com/china/citylist-0-0-1/
第2頁:https://place.qyer.com/china/citylist-0-0-2/
第3頁:https://place.qyer.com/china/citylist-0-0-5/
第171頁:https://place.qyer.com/china/citylist-0-0-171/
發現只有位址列末尾的數字隨著頁數在變化。所以我們加上一個簡單的迴圈即可。
for in range(171):# 1.找爬蟲所在url地址(系統性的網頁分析)
url ='https://place.qyer.com/china/citylist-0-0-{}/'.format(i)
好了到此為止所有爬蟲部分已經完成,為了更友好的人際互動,我們再最佳化一下提示資訊。
page = 0foriinrange(171): page+=1print('--------正在爬取第{}頁--------'.format(page))
還有為了方式ip被封,所以我們要給爬蟲設定一個休眠時間,休眠時間取得是隨機數。
time.sleep(random.random()*5)
執行結果如下(此處選取部分截圖)