網址:http://www.halehuo.com/jingqu.html
經過查看可以發現,該景區頁面沒有分頁,不停的往下拉,頁面會進行刷新顯示后面的景區信息
通過使用瀏覽器調試器,發現該網站使用的是post請求,使用ajax傳輸數據
請求參數:
響應數據:
經過以上分析,大致思路如下:
(1)向請求網站使用post方式傳遞參數,先傳遞首頁參數,獲得json數據,然后進行數據提取,獲取所需要的數據
(2)使用for循環遍歷獲取數據
需要注意的地方:
(1)景區logo圖片獲取的是相對地址,通過構造一個函數獲得景區logo的絕對地址
(2)獲取到的景區詳情鏈接打不開,通過景區列表頁面打開景區詳情頁面,發現獲取的景區詳情鏈接跟景區詳情頁面鏈接不匹配再構造一個函數處理獲取到的景區詳情鏈接
#!/usr/bin/env python # -*- coding: utf-8 -*-
import csv import json from urllib.parse import urlencode import requests # 構造參數,發起請求,獲得數據 def get_page_index(pageindex): data = { 'citycode': 0, 'countycode': 0, 'keywords': 0, 'pageindex': pageindex, 'sceniclev': 0, 'themetype': 0, } params = urlencode(data) base = 'http://www.halehuo.com/index.php/Scenic/getScenicList' url = base + '?' + params try: response = requests.get(url) if response.status_code == 200: return response.text return None except ConnectionError: print('Error occurred') return None # 處理景區logo地址 def get_log_url(url): base_url = 'http://www.halehuo.com'
return base_url + url # 處理景區詳情鏈接 def get_detail_url(url): return url.replace('index.php/Scenic/main/id', 'jingqu') # 解析獲得的景區數據 def parse_page_index(pageindex): item = get_page_index(pageindex) items = json.loads(item)['data'] for item in items: yield { 'id': item['id'], 'scenic_name': item['scenic_name'], 'logo': get_log_url(item['logo']), 'address': item['address'], 'policy': item['policy'], 'url': get_detail_url(item['url']), 'remarks': item['remarks'] } # 數據存儲到csv
def write_to_file3(item): with open('jingqu_detail.csv', 'a', encoding='utf_8_sig', newline='') as f: # 'a'為追加模式(添加)
# utf_8_sig格式導出csv不亂碼
fieldnames = ['id', 'scenic_name', 'logo', 'address', 'policy', 'url', 'remarks'] w = csv.DictWriter(f, fieldnames=fieldnames) # w.writeheader()
# print(item)
w.writerow(item) def main(): for i in range(1, 13): items = parse_page_index(i) for item in items: write_to_file3(item) if __name__ == '__main__': main()
保存到csv文件的截圖如下: