1. 程式人生 > 實用技巧 >python爬蟲:爬取窮遊網的地點資料,世界那麼大,我想去看看。

python爬蟲:爬取窮遊網的地點資料,世界那麼大,我想去看看。

本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯絡我們以作處理

一、前言

世界那麼大,我想去看看。
要麼讀書,要麼旅遊,身體和心靈必須有一個在路上。
想必大家心裡都向往旅遊,那麼旅遊中的行程安排和地區熱門景點有哪些呢?
可能都需要在網上去找旅遊攻略,今天就帶大家採集旅遊網站的景點資料。

二、課程亮點

  1. 系統分析網頁性質
  2. 結構化的資料解析
  3. csv資料儲存

三、所用到得庫

import csv
import requests
import parsel
from concurrent.futures import ProcessPoolExecutor
import multiprocessing

四、環境配置

python 3.6
pycharm
requests
parsel
csv

五、爬蟲案例的一般實現步驟:

1.找資料所在的URL地址
2.傳送網路請求
3.資料的解析(我們需要的資料)
4.資料的儲存

六、找尋資料所在處

lock = multiprocessing.Lock()  # 建立程序鎖物件

def send_request(url):
    """請求資料"""
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36
'} html_data = requests.get(url=url, headers=headers).text return html_data

七、完整程式碼:

def parse_data(html_data):
    selector = parsel.Selector(html_data)
    lis = selector.xpath('//ul[@class="plcCitylist"]/li')

    for li in lis:
        travel_place = li.xpath('.//h3/a/text()').get()  # 目的地
travel_people = li.xpath('.//p[@class="beento"]/text()').get() # 去過的人數 travel_hot = li.xpath('.//p[@class="pois"]/a/text()').getall() # 熱門景點 travel_hot = [hot.strip() for hot in travel_hot] travel_hot = ''.join(travel_hot) travel_url = li.xpath('.//h3/a/@href').get() # 目的地詳情頁url travel_imgUrl = li.xpath('./p/a/img/@src').get() # 圖片url print(travel_place, travel_people, travel_hot, travel_url, travel_imgUrl, sep=' | ') yield travel_place, travel_people, travel_hot, travel_url, travel_imgUrl def save_data(data_generator): with open('窮遊網.csv', mode='a', encoding='utf-8', newline='') as f: csv_write = csv.writer(f) for data in data_generator: lock.acquire() # 加鎖 csv_write.writerow(data) lock.release() # 釋放鎖 def main(url): html_data = send_request(url) parse_result = parse_data(html_data) save_data(parse_result) if __name__ == '__main__': # main('https://place.qyer.com/china/citylist-0-0-1') with ProcessPoolExecutor(max_workers=13) as executor: for page in range(1, 172): url = f'https://place.qyer.com/china/citylist-0-0-{page}/' executor.submit(main, url)