Ajax爬取豆瓣電影目錄(Python)

下面的分析相當于一個框架,搞懂之后,對于類似的文字爬取,我們也可以實現。就算不能使用Ajax方法,我們也能夠使用相同思想去爬取我們想要的數據。

?

豆瓣電影排行榜分析

網址:https://movie.douban.com/explore#!type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0

首先我們打開網頁的審查元素,選中Network==》XHR==》電影相關信息網頁文件

篩選并比較以下數據(三個文件數據)

請求地址

Request URL:https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0

Request URL:https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=20

Request URL:https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=40

?

查詢參數

type:movie
tag:熱門
sort:recommend
page_limit:20
page_start:0type:movie
tag:熱門
sort:recommend
page_limit:20
page_start:20type:movie
tag:熱門
sort:recommend
page_limit:20
page_start:40

?

請求報頭

Host:movie.douban.com
Referer:https://movie.douban.com/explore
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36
X-Requested-With:XMLHttpRequest

?

通過比較請求地址和查詢參數,得出

請求地址 = baseurl+type+tag+sort+page_limit+page_startbaseurl:https://movie.douban.com/j/search_subjects?
type:固定為movie
tag:關鍵字,需要將utf-8轉換為urlencode
sort:固定為recommend
page_limit:表示一頁顯示的電影數量,固定20
page_start:表示電影頁數,從0開始,20為公差的遞增函數

?

由此我們獲取到了我們需要的數據,可以將爬蟲分為三步

  1. 獲取網頁json格式代碼
  2. 從代碼中獲取電影名和電影海報圖片鏈接
  3. 將獲得的圖片命名為電影名

?

一 準備工作

在函數外部定義偽裝的請求報頭

headers={'Host': 'movie.douban.com','Referer': 'https://movie.douban.com/explore','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36','X-Requested-With': 'XMLHttpRequest'
}

?

二 獲取json格式代碼

def get_page(page):#請求參數params={'type': 'movie','tag': '奧特曼','sort': 'recommend','page_limit': '20','page_start': page,}#基本網頁鏈接base_url = 'https://movie.douban.com/j/search_subjects?'#將基本網頁鏈接與請求參數結合在一起url = base_url + urlencode(params)try:#獲取網頁代碼resp = requests.get(url, headers=headers)print(url)#返回json數據格式代碼if 200 == resp.status_code:print(resp.json())return resp.json()except requests.ConnectionError:return None

?

三 篩選數據

通過觀察電影列表代碼文件的preview,進行數據篩選

def get_image(json):if(json.get('subjects')):data=json.get('subjects')for item in data:title=item.get('title')imageurl=item.get('cover')#返回"信息"字典yield {'title':title,'images':imageurl,}

?

四 存儲圖片文件

def save_page(item):#文件夾名稱file_name = '奧特曼電影大全'if not os.path.exists(file_name):os.makedirs(file_name)#獲取圖片鏈接response=requests.get(item.get('images'))#儲存圖片文件if response.status_code==200:file_path = file_name + os.path.sep + item.get('title') + '.jpg'with open(file_path, 'wb') as f:f.write(response.content)

?

五 多線程處理

def main(page):json = get_page(page)for item in get_image(json):print(item)save_page(item)if __name__ == '__main__':pool = Pool()pool.map(main, [i for i in range(0, 200, 20)])pool.close()pool.join()

?

?

總代碼

?

import requests
from urllib.parse import urlencode
import os
from multiprocessing.pool import Poolheaders={'Host': 'movie.douban.com','Referer': 'https://movie.douban.com/explore','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36','X-Requested-With': 'XMLHttpRequest'
}def get_page(page):#請求參數params={'type': 'movie','tag': '奧特曼','sort': 'recommend','page_limit': '20','page_start': page,}#基本網頁鏈接base_url = 'https://movie.douban.com/j/search_subjects?'#將基本網頁鏈接與請求參數結合在一起url = base_url + urlencode(params)try:#獲取網頁代碼resp = requests.get(url, headers=headers)print(url)#返回json數據格式代碼if 200 == resp.status_code:print(resp.json())return resp.json()except requests.ConnectionError:return Nonedef get_image(json):if(json.get('subjects')):data=json.get('subjects')for item in data:title=item.get('title')imageurl=item.get('cover')#返回"信息"字典yield {'title':title,'images':imageurl,}def save_page(item):#文件夾名稱file_name = '奧特曼電影大全'if not os.path.exists(file_name):os.makedirs(file_name)#獲取圖片鏈接response=requests.get(item.get('images'))#儲存圖片文件if response.status_code==200:file_path = file_name + os.path.sep + item.get('title') + '.jpg'with open(file_path, 'wb') as f:f.write(response.content)def main(page):json = get_page(page)for item in get_image(json):print(item)save_page(item)if __name__ == '__main__':pool = Pool()pool.map(main, [i for i in range(0, 200, 20)])pool.close()pool.join()

?

?本來是準備使用https://movie.douban.com/tag/#/?不過在后面,刷新網頁時,總是出現服務器問題。不過下面的代碼還是可以用。

import requests
from urllib.parse import urlencode
import os
from hashlib import md5
from multiprocessing.pool import Poolheaders={'Host': 'movie.douban.com','Referer': 'https://movie.douban.com/tag/','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
}def get_page(page):params={'sort':'U','range':'0,10','tags':'奧特曼','start': page,}base_url = 'https://movie.douban.com/j/new_search_subjects?'url = base_url + urlencode(params)try:resp = requests.get(url, headers=headers)print(url)if 200 == resp.status_code:print(resp.json())return resp.json()except requests.ConnectionError:return Nonedef get_image(json):if(json.get('data')):data=json.get('data')for item in data:title=item.get('title')imageurl=item.get('cover')yield {'title':title,'images':imageurl,}def save_page(item):file_name='奧特曼大全'+os.path.sep+item.get('title')if not os.path.exists(file_name):os.makedirs(file_name)try:response=requests.get(item.get('images'))if response.status_code==200:file_path = '{0}/{1}.{2}'.format(file_name, md5(response.content).hexdigest(), 'jpg')if not os.path.exists(file_path):with open(file_path, 'wb') as f:f.write(response.content)else:print('Already Downloaded', file_path)except requests.ConnectionError:print('Failed to Save Image')def main(page):json = get_page(page)for item in get_image(json):print(item)save_page(item)if __name__ == '__main__':pool = Pool()pool.map(main, [i for i in range(0, 200, 20)])pool.close()pool.join()

?

轉載于:https://www.cnblogs.com/Mayfly-nymph/p/10780620.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/393859.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/393859.shtml
英文地址,請注明出處:http://en.pswp.cn/news/393859.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

到底死不死我就請了七天假_“你到底死不死?我只請了7天假”

這兩天看到一條令人心酸的新聞,在國內某地鐵站內,一位57歲的大媽突發心臟病,被緊急救醒后,第一句話竟是請求工作人員不要打電話通知她遠在德國的兒子。看完這條新聞,掌柜特別心酸,孤身一人在國內&#xff0…

正面管教PHP沙龍,正面管教沙龍體會

接觸到正面管教這個理念是我們南寧行動派伙伴圈 的圈主西西給大家帶來的分享,謝謝西西[愛你]圖片發自簡書App同時也很感謝親切溫柔,知性優雅的Liliane老師,讓我明白表揚和鼓勵的區別,非暴力教育……教書育人這個道路上我需要學習的…

FB面經Prepare: Dot Product

Conduct Dot Product of two large Vectors 1. two pointers 2. hashmap 3. 如果沒有額外空間,如果一個很大,一個很小,適合scan小的,并且在大的里面做binary search 1 package fb;2 3 public class DotProduct {4 5 publi…

leetcode1291. 順次數(回溯)

我們定義「順次數」為:每一位上的數字都比前一位上的數字大 1 的整數。 請你返回由 [low, high] 范圍內所有順次數組成的 有序 列表(從小到大排序)。 示例 1: 輸出:low 100, high 300 輸出:[123,234] …

20175223 MySQL

目錄 完成結果要求 1 :導入world.sql要求 2 :CityWanna.javaCityWanna.java要求 3 :CountryWanna.javaCountryWanna.java要求 4 :LifeWanna.javaLifeWanna.java過程中問題及解決1. XAMPP無法啟用 MySQL 程序。目錄 完成結果 要求 …

2020運動相機推薦_2020年超有價值入門級微單相機推薦,超高性價比幾款入門級微單相機(選購指南)...

學習攝影專業已經3年多啦,自己喜歡拍攝照片,自己還幫助過一些想學習攝影的朋友快速入門,最近發現周圍學習攝影的朋友也越來越多了,有一些朋友咨詢關于入門微單相機的問題,想讓推薦幾款不錯的入門的微單相機。這篇文章帶…

javascript入門_JavaScript代理快速入門

javascript入門What is a JavaScript proxy? you might ask. It is one of the features that shipped with ES6. Sadly, it seems not to be widely used.什么是JavaScript代理? 你可能會問。 這是ES6附帶的功能之一。 可悲的是,它似乎并未得到廣泛使用…

linux缺少文件操作數,linux 文件的atime,ctime,mtime查看與修改

查看ls -a默認顯示的是修改時間ls -c / --timestatus / --timectime顯示的是狀態修改時間(即權限修改時間)ls -u / --timeuse / --timeaccess / --timeatime表示的是文件訪問時間修改touch: 缺少了文件操作數請嘗試執行“touch --help”來獲取更多信息。[weilocalhost ~]$ touc…

leetcode47. 全排列 II(回溯)

給定一個可包含重復數字的序列&#xff0c;返回所有不重復的全排列。 示例: 輸入: [1,1,2] 輸出: [ [1,1,2], [1,2,1], [2,1,1] ] 代碼 class Solution {List<List<Integer>> cListnew ArrayList<>();public List<List<Integer>> permuteUni…

linux 磁盤查看方式

fdisk (查看物理磁盤大小) df (查看文件系統&#xff0c;也就是正在使用磁盤大小) lsblk (查看邏輯磁盤大小)轉載于:https://www.cnblogs.com/MUQINGFENG123/p/10820345.html

ioslabel陰影,UILabel的內陰影

is it possible to create such a UILabel with inner and outer shadow?i only know shadowColor and shadowOffsetzoomed:thanks!解決方案The answer by dmaclach is only suitable for shapes that can easily be inverted. My solution is a custom view that works with …

Webpack初學者介紹

Webpack is a tool that lets you compile JavaScript modules. It’s also known as a module bundler.Webpack是使您可以編譯JavaScript模塊的工具。 也稱為模塊捆綁器 。 Given a large number of files, it generates a single file (or a few files) that run your app.給…

Android Coding利器之掌握小技巧,助你Coding更上一層樓~

本文講的是Android Coding利器之掌握小技巧&#xff0c;助你Coding更上一層樓~&#xff0c;話說前幾天在網上瀏覽到一大牛寫的關于Android布局優化的文章&#xff0c;看后感觸很深&#xff0c;回過頭看看自己寫過的代碼&#xff0c;發現還是有不少需要改進&#xff0c;今天找不…

linux系統報警怎么辦,常見Linux系統故障和解決方法

常見Linux系統故障和解決方法發布時間&#xff1a;2020-06-06 14:48:19來源&#xff1a;億速云閱讀&#xff1a;212作者&#xff1a;Leah欄目&#xff1a;云計算這篇文章給大家分享的是常見的Linux系統故障和解決方法。在使用系統的過程中總會有各種各樣的故障&#xff0c;所以…

Vuex 模塊化與項目實例 (2.0)

Vuex 強調使用單一狀態樹&#xff0c;即在一個項目里只有一個 store&#xff0c;這個 store 集中管理了項目中所有的數據以及對數據的操作行為。但是這樣帶來的問題是 store 可能會非常臃腫龐大不易維護&#xff0c;所以就需要對狀態樹進行模塊化的拆分。 首先貼出一個邏輯比較…

click js自動點擊 vue_vue.js2.0點擊獲取自己的屬性和jquery方法

如下所示&#xff1a;:data-index"index":dt"index"v-on:click"onclick($event,index)":data-d "JSON.stringify( item)"href"http://www.baidu.com" rel"external nofollow" rel"external nofollow"da…

Python:知識目錄

Python目錄 第一篇&#xff1a;數據類型部分文件操作 基礎數據類型---str 基礎數據類型---List 基礎數據類型---dict 基礎數據類型---set 基礎數據類型---bytes 數據類型的總結 文件操作------讀&#xff0c;寫 文件操作------使用方法 第二章&#xff1a;函數模塊 初識函數…

初學者css常見問題_5分鐘內學習CSS-初學者教程

初學者css常見問題關于網絡設計語言的快速教程。 (A quick tutorial on the design language of the web.) CSS (Cascading Style Sheets) is what makes web pages look good and presentable. It’s an essential part of modern web development and a must-have skill for …

leetcode39. 組合總和(回溯)

給定一個無重復元素的數組 candidates 和一個目標數 target &#xff0c;找出 candidates 中所有可以使數字和為 target 的組合。 candidates 中的數字可以無限制重復被選取。 說明&#xff1a; 所有數字&#xff08;包括 target&#xff09;都是正整數。 解集不能包含重復的…

一臉懵逼學習基于CentOs的Hadoop集群安裝與配置(三臺機器跑集群)

1&#xff1a;Hadoop分布式計算平臺是由Apache軟件基金會開發的一個開源分布式計算平臺。以Hadoop分布式文件系統&#xff08;HDFS&#xff09;和MapReduce&#xff08;Google MapReduce的開源實現&#xff09;為核心的Hadoop為用戶提供了系統底層細節透明的分布式基礎架構。 注…