日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python爬虫今日头条_python爬虫—分析Ajax请求对json文件爬取今日头条街拍美图

發(fā)布時間:2024/10/14 python 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python爬虫今日头条_python爬虫—分析Ajax请求对json文件爬取今日头条街拍美图 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

python爬蟲—分析Ajax請求對json文件爬取今日頭條街拍美圖

前言

本次抓取目標是今日頭條的街拍美圖,爬取完成之后,將每組圖片下載到本地并保存到不同文件夾下。下面通過抓取今日頭條街拍美圖講解一下具體操作步驟。

一、準備

網(wǎng)站:

https://www.toutiao.com/search/?keyword=%E8%A1%97%E6%8B%8D

環(huán)境:anaconda3-spyder

二、分析網(wǎng)頁

一些網(wǎng)頁直接請求得到的HTML代碼其實并沒有我們在網(wǎng)頁中看到的內容,這是因為一些信息通過Ajax加載了,然后通過JavaScript渲染生成的,這時就需要通過分析網(wǎng)頁的請求來獲取想要爬取的內容。例如我進入街拍這個頁面下,右鍵查看網(wǎng)頁源代碼,再返回街拍頁面一直向下拉動,街拍頁面會變換出現(xiàn)不同的內容和圖片,再右鍵查看源代碼,發(fā)現(xiàn)源代碼和第一次我們查看的源代碼是一樣的,沒有發(fā)生變化,并且源代碼很短。如下所示:

所以重點來了,想看數(shù)據(jù)在哪,我們如何定位呢?

1、Chrome查看的Ajax請求

打開開發(fā)者工具,查看所有的網(wǎng)絡請求

2、查看URL內的數(shù)據(jù)

我們再data下面能夠找到title

還能夠找到image_list,包含圖片的鏈接,也就是我們要爬取的圖片url。因此,我們只需要將列表中的url字段提取出來并下載就ok了,每一組圖都建立一個文件夾,文件夾的名稱就為組圖的標題。

3、請求URL和Headers信息找規(guī)律

屬性位置的定位找到了以后,我們還需分析一下URL的變化規(guī)律。點擊headers,觀察它的請求URL和Headers信息,查看第一個headers,紅框里確實包含很多參數(shù)

這么多參數(shù)不用蒙圈,因為都在下面顯示好了

現(xiàn)在我們查看第二個headers的url參數(shù),發(fā)現(xiàn)有一個參數(shù)發(fā)生了變化,offest由0變成20

我們再觀察第三個headers的url的參數(shù)

offest變成了40,所以不難發(fā)現(xiàn),除了offest以外,其他參數(shù)都是不變的,只有offest發(fā)生變化,并且變化的規(guī)律為0、20、40、60…這樣的規(guī)律。所以說這個offset值就是偏移量,進而可以推斷出頁面每加載一次,獲取的數(shù)據(jù)條數(shù)為20。因此,我們可以用offset參數(shù)來控制數(shù)據(jù)分頁,通過這個接口批量獲取數(shù)據(jù)了,然后解析。

三、代碼實現(xiàn)

1、導包

第一個包,主要目的是通過from urllib.parse import urlencode構造完整的URL。Urllib是python內置的HTTP請求庫,urllib.parse url解析模塊。

第四個os模塊主要和文件路徑相關聯(lián)

第五個把字符串換成MD5的方法

from urllib.parse import urlencode

import requests

import json

import os

from hashlib import md5

2、首先獲取請求并返回解析頁面

定義一個函數(shù)get_page()來加載單個Ajax請求的結果。由上述分析可知唯一變化的參數(shù)就是offset,所以我們將它當作參數(shù)傳遞進來。如果訪問成功,狀態(tài)碼為200,最后返回的就是json格式的解析頁面

def get_page(offest):#獲取請求并返回解析頁面

params = {

'aid': '24',

'app_name': 'web_search',

'offset': offest,

'format': 'json',

'keyword': '街拍',

'autoload': 'true',

'count': '20',

'en_qc': '1',

'cur_tab': '1',

'from': 'search_tab',

'pd': 'synthesis',

'timestamp': '1602563085392',

'_signature': 'LfFmxgAgEBBOl5xAwmvANy3wJ9AAHJ7m7oodN5ACyp.Hg2l3uBmMDqDDDN6rWnqjaV0akHlvj327I-FN9Xrxz9FT7hdlRtmAVGnGPJlX5zzT8tcamaIq51QEsm2ry1w0eu0'

}

url = base_url + urlencode(params)

try:

rq = requests.get(url,headers = headers)

if rq.status_code == 200 :

#print(rq.json())

return rq.json()

except rq.ConnectionError as e:

print('程序錯誤',e.args)

3、解析出data下的title和image_list的url

html為上面函數(shù)解析出來的json頁面信息,我們作為參數(shù)傳進這個函數(shù)中,需先找到html下的data,再從data下找title和image_list.

def get_images(html):

if html.get('data'): #得到data下的全部內容

for item in html.get('data'): #用item循環(huán)每一條

#這里需要判斷image_list是否為空

title = item.get('title')

if 'image_list' in item and item['image_list'] != []:

images=item['image_list']

for image in images:

yield{

'image': image.get('url'),

'title': title

}#返回一個字典

4、建文件夾存圖片

item為data下的所有內容

如果文件夾不存在,那么就os.mkdir新建一個以title為名的文件夾,item.get(‘title’)中括號里的title是上面那個函數(shù)返回的

‘image’: image.get(‘url’),

‘title’: title

把它定義成了title

如果我們成功訪問了圖片的鏈接地址,那么就可以圖片命名了,這里用了哈希算法(我下去還得好好再理解一下)。接下來如果文件夾里面沒東西,就打開文件夾寫入圖片response.content。

def save_image(item):

#os.path模塊主要用于文件的屬性獲取,exists是“存在”的意思,

#所以顧名思義,os.path.exists()就是判斷括號里的文件夾'picture'+str(offset)是否存在的意思,括號內的可以是文件路徑。

if not os.path.exists(item.get('title')):#判斷當前文件夾下是否有該文件

os.mkdir(item.get('title'))#如果不存在就創(chuàng)建該文件夾

try:

response=requests.get(item['image']) #get函數(shù)獲取圖片鏈接地址,requests發(fā)送訪問請求,上面那個字典

if response.status_code==200:

file_path='{0}/{1}.{2}'.format(item.get('title'),md5(response.content).hexdigest(),'jpg')

# md5摘要算法(哈希算法),通過摘要算法得到一個長度固定的數(shù)據(jù)塊。將文件保存時,通過哈希函數(shù)對每個文件進行文件名的自動生成。

# md5() 獲取一個md5加密算法對象

# hexdigest() 獲取加密后的16進制字符串

if not os.path.exists(file_path):

with open(file_path,'wb') as f:

f.write(response.content)

print('Downloaded image path is: ', file_path)

else:

print('Already Dowloaded',file_path)

except requests.ConnectionError:

print('Failed to Save Image')

5、主函數(shù)調用

先存如兩頁的圖片

if __name__ == '__main__':

base_url = 'https://www.toutiao.com/api/search/content/?'

headers = {

'referer': 'https://www.toutiao.com/search/?keyword=%E8%A1%97%E6%8B%8D',

'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36',

'x-requested-with': 'XMLHttpRequest'

}

for offest in range(0,40,20):

html = get_page(offest)

a=get_images(html)

for item in a:

save_image(item)

for i in a:

print(i)

四、結果展示

我把存入的過程依次輸出

查看文件!

總結

以上是生活随笔為你收集整理的python爬虫今日头条_python爬虫—分析Ajax请求对json文件爬取今日头条街拍美图的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。