1. 程式人生 > >python --爬蟲基礎 --爬取今日頭條 使用 requests 庫的基本操作, Ajax

python --爬蟲基礎 --爬取今日頭條 使用 requests 庫的基本操作, Ajax

'''
思路
一: 由於是Ajax的網頁,需要先往下劃幾下看看XHR的內容變化
二:分析js中的程式碼內容
三:獲取一頁中的內容
四:獲取圖片
五:儲存在本地

使用的庫1. requests 網頁獲取庫
2.from urllib.parse import urlencode 將字典轉化為字串內容整理拼接到url
3.os 操作檔案的庫
4.from hashlib import md5 md5 的雜湊庫
5.from multiprocessing.pool import Pool 多執行緒庫
'''

import requests
from urllib.parse import urlencode from requests import codes import os from hashlib import md5 from multiprocessing.pool import Pool # 首先是獲取一頁的內容,觀察XHR可得知 載入圖片是改變offset的值,觀察XHR內容得知url和字典內容拼接的字串為目標網頁,判斷網頁是否響應,如果響應則返回json格式檔案,如果不響應則 # 丟擲 def get_page(offset): params = {'offset': offset,
'format': 'json', 'keyword': '街拍', 'autoload': 'true', 'count': '20', 'cur_tab': '1', 'from': 'search_tab' } base_url = 'https://www.toutiao.com/search_content/?' # 基礎網頁的基礎網址 url = base_url + urlencode(params) # 拼接網址 try: resp = requests.get(url)
if resp.status_code == 200: return resp.json() except: return None # 第二步,已經獲取網頁的url,接下來獲取想要的內容,已經知道需求是獲取妹子圖片,通過傳入json ,進一步實現獲取內 # 容,調取json的方法get(),傳入鍵名字,獲取內容 def get_img(json): if json.get('data'): # data是原網頁的一個數據集合 data = json.get('data') for item in data: # 遍歷data的內容, if item.get('cell_type') is not None: continue title = item.get('title') images = item.get('image_list') for image in images: yield { 'image': 'https:' + image.get('url'), 'title': title } # 第三步,儲存內容到本地,傳入的內容是,獲取圖片中的item,引入os庫用於資料夾操作 def save_files(item): img_path = 'img' + os.path.sep +item.get('title') if not os.path.exists(img_path): # 判斷資料夾是否存在,如果存在繼續,不存在建立繼續 os.makedirs(img_path) try: resq = requests.get(item.get('image')) if resq.status_code == 200: file_path = img_path + os.path.sep + '{file_name}.{file_suf}'.format( file_name=md5(resq.content).hexdigest(), # 把獲取的內容md5處理獲得內容 file_suf='jpg' ) if not os.path.exists(file_path): with open(file_path, 'wb') as f: f.write(resq.content) print('Downloaded image path is' + file_path) else: print('Already Downloaded', file_path) except requests.ConnectionError: print('Failed to Save Image,item %s' % item) #第四步 建立執行主函式 main 方法 ,通過offset 資料改變獲取內容 def main (offset): json = get_page(offset) for item in get_img(json): save_files(item) GROUP_START = 0 GROUP_END = 7 #最後呼叫多執行緒 進行下載 if __name__ == '__main__': pool = Pool() groups = ([x * 20 for x in range(GROUP_START, GROUP_END + 1)]) pool.map(main, groups) pool.close() pool.join()

 

 

Ajax 針對類似微博,今日頭條那種需要下拉,內容放在js裡的網頁