分析ajax請求踱侣,爬取今日頭條街拍圖片

知識點整理:
  • 目錄:
    1.分析目標網(wǎng)頁代碼結構;
    2.代碼爬取數(shù)據(jù)大磺;
    3.保存或下載數(shù)據(jù)。
一探膊、分析網(wǎng)頁

我們在頭條搜索“街拍”彈的網(wǎng)址https://www.toutiao.com/search/?keyword=街拍杠愧,我們按F12查詢源碼,但很明顯這個頁面沒有我們東西

image.png

因此可以想像這個頁面內容可能是用ajax加載逞壁,點擊XHR流济,看到這里也有一個請求
image.png

而且這個請求頁的內容適好就是這個頁面圖片內容锐锣,所以目標爬取索引頁地址就是這個https://www.toutiao.com/search_content/?,請求這個索引頁之后就來到圖片詳情頁https://www.toutiao.com/a6579859429166940680/绳瘟, 同樣也是F12打開網(wǎng)頁源碼雕憔,而經(jīng)過查找看到這些圖片的地址是直接藏在網(wǎng)頁里面,
image.png

所以我們就可以請求這個頁面糖声,然后用正則獲取我們詳情頁的美圖地址

二斤彼、寫代碼爬取

這里要注意幾個點:

  • 1、 請求索引頁的時候https://www.toutiao.com/search_content/?這個頁面是有參數(shù)的蘸泻,
    image.png

    因此需要將這些參數(shù)urlencode一下然后拼接到請求地址
  • 2琉苇、 請求詳情頁的時候,由于網(wǎng)站做了簡單的反爬悦施,需要在請求的時候加入請求頭hearders并扇,這樣才能獲取到剛剛內容
  • 3、 獲取到詳情頁內容抡诞,用正則獲取到藏有詳情頁圖片地址的json字符串就這樣的格式:{\"count\":6,\"sub_images\":[{\"url\":\"http:\\/\\/p9.pstatp.com\\/origin\\/pgc-image\\/.......}穷蛹,反斜杠\有轉義效果,因此不能直接用json.loads將字符串轉為python對象昼汗,直轉的話會報錯json.decoder.JSONDecodeError俩莽,所以我們可能用正則re.sub()或內置函數(shù)replace()將字符串替換一下,然后再json.loads()轉換
三乔遮、下載保存

這一步比較簡單扮超,就是直接insert 到MongoDB和write一下文件就可以了,直接看代碼就能理解

附上源碼:
  • 配置文件---config.py
MONGO_URL='localhost' #MongoDB本地連接
MONGO_DB='toutiao' #數(shù)據(jù)庫名
MONGO_TABLE='toutiao' #表名

GROUP_START=0 #起始
GROUP_END =20 #結束

KEYWORD = '街拍' #搜索關鍵詞
  • 執(zhí)行代碼文件---spider.py
# -*- coding: utf-8 -*-

import requests
from requests.exceptions import RequestException
from urllib.parse import urlencode
import json
from bs4 import BeautifulSoup
import re
from config import *
import pymongo
from hashlib import md5
import os
from multiprocessing import Pool

#client = pymongo.MongoClient(MONGO_URL,connect=False)#由于啟動多進程爬取蹋肮,所以與MongoDB數(shù)據(jù)庫連接時可能會報錯出刷,就需要加上connect=False,
client = pymongo.MongoClient(MONGO_URL)#連接MongoDB
db = client[MONGO_DB]#創(chuàng)建數(shù)據(jù)庫

def get_page_index(offset,keyword):
    data={
        'offset': offset,
        'format': 'json',
        'keyword': keyword,
        'autoload': 'true',
        'count': '20',
        'cur_tab': 3,
        'from':'gallery',
    }
    url='https://www.toutiao.com/search_content/?'+urlencode(data)
    try:
        response = requests.get(url)
        if response.status_code==200:
            return response.text
        return None
    except RequestException:
        print("請求索引頁url出錯")
        return None

def parse_page_index(html):
    data = json.loads(html)#將json字符串轉換成python對象
    if data and 'data'in data.keys():
        for item in data.get('data'):
            yield item.get('article_url')#將方法變成生成器每次返回一個url

def get_page_detail(url):
    headers= {
        'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
    }
    try:
        response = requests.get(url,headers=headers)#爬取詳情頁需要加請求頭,不然獲取不了數(shù)據(jù)
        if response.status_code==200:
            return response.text#response.text一般來說這個返回網(wǎng)頁源碼
        return None
    except RequestException:
        print("請求詳情頁出錯",url)
        return None

def parse_page_detail(html,url):
    soup = BeautifulSoup(html,'lxml')
    title = soup.select('title')[0].get_text()
    print(title)
    images_pattern = re.compile('gallery: JSON.parse\("(.*?)"\),',re.S)#根據(jù)數(shù)據(jù)特點用正則篩選想要的數(shù)據(jù)
    result = re.search(images_pattern,html)
    if result:
        #print(result.group(1))
        page_detail = result.group(1)
        page_result = page_detail.replace('\\"','"',10000)#這個替換是為了修正數(shù)據(jù)格式坯辩,這樣才能用json.loads,否則會報錯json.decoder.JSONDecodeError
        last_change = page_result.replace('\\/','/',10000)#這個替換是為了修正詳情頁圖片地址
        #print(page_result)
        data = json.loads(last_change)
        if data and 'sub_images'in data.keys():
            sub_images = data.get('sub_images')
            images = [item.get('url') for item in sub_images]#將詳情頁圖片url循環(huán)生成列表
            for image in images: download_image(image)#將詳情頁圖片url循環(huán)下載
            return {
                'title':title,
                'url':url,
                'images':images
            }

def save_to_mongo(result):
    if db[MONGO_TABLE].insert(result):#將結果插入到MongoDB
        print('存儲到MongoDB成功',result)
        return True
    return False

def download_image(url):
    print("正在下載:",url)
    try:
        response = requests.get(url)
        if response.status_code==200:
            save_image(response.content)##response.content一般來說這個返回文件馁龟,圖片等二進制內容
        return None
    except RequestException:
        print("下載圖片出錯",url)
        return None

def save_image(content):
    file_path = '{0}/{1}/{2}.{3}'.format(os.getcwd(),'download_image', md5(content).hexdigest(),'jpg')
    if not os.path.exists(file_path):
        with open(file_path,'wb') as f:
            f.write(content)
            f.close()

def main(offset):
    html = get_page_index(offset,KEYWORD)
    #print(html)
    for url in parse_page_index(html):
        print(url)
        html =  get_page_detail(url)
        #print(html)
        if html:
            result = parse_page_detail(html,url)
            #print(result)
            save_to_mongo(result)

if __name__ == '__main__':
    #main()
    groups = [x*20 for x in range(GROUP_START,GROUP_END+1)]
    poll = Pool()
    poll.map(main,groups)


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市漆魔,隨后出現(xiàn)的幾起案子坷檩,更是在濱河造成了極大的恐慌,老刑警劉巖改抡,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矢炼,死亡現(xiàn)場離奇詭異,居然都是意外死亡阿纤,警方通過查閱死者的電腦和手機句灌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人胰锌,你說我怎么就攤上這事骗绕。” “怎么了资昧?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵酬土,是天一觀的道長。 經(jīng)常有香客問我格带,道長撤缴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任践惑,我火速辦了婚禮腹泌,結果婚禮上,老公的妹妹穿的比我還像新娘尔觉。我一直安慰自己凉袱,他們只是感情好,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布侦铜。 她就那樣靜靜地躺著专甩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪钉稍。 梳的紋絲不亂的頭發(fā)上涤躲,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機與錄音贡未,去河邊找鬼种樱。 笑死,一個胖子當著我的面吹牛俊卤,可吹牛的內容都是我干的嫩挤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼消恍,長吁一口氣:“原來是場噩夢啊……” “哼岂昭!你這毒婦竟也來了?” 一聲冷哼從身側響起狠怨,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤约啊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后佣赖,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恰矩,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年茵汰,在試婚紗的時候發(fā)現(xiàn)自己被綠了枢里。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡蹂午,死狀恐怖栏豺,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情豆胸,我是刑警寧澤奥洼,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站晚胡,受9級特大地震影響灵奖,放射性物質發(fā)生泄漏。R本人自食惡果不足惜估盘,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一瓷患、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧遣妥,春花似錦擅编、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至境钟,卻和暖如春锦担,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背慨削。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工洞渔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人缚态。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓磁椒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親猿规。 傳聞我的和親對象是個殘疾皇子衷快,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,262評論 25 707
  • 前言 本博客主要記錄跟隨崔慶才老師的分析Ajax抓取今日頭條街拍美圖學習的整個過程,更多精品文章姨俩,請參閱崔老師的博...
    小白猿閱讀 1,125評論 3 10
  • 與你初見 是一個夏天的晚上 雨下著下著就停了 方磚鋪成的廣場變得空曠 只有我們的影子 被倒映的路燈拉得好長 一把你...
    玉露情歌閱讀 135評論 0 5
  • 2007年8月10號蘸拔,晨讀內容,說話的力量 為什么有的人說話沒有分量环葵,不能影響身邊的人调窍,慢慢會覺得自己人微言輕,于...
    體重管理教練王萍閱讀 225評論 0 1
  • 范雨素突然爆紅张遭,我慶幸在輿論大肆喧嘩之前看到了他寫了的文章邓萨,的確給我震撼,可遇不可求的文字。 我不懂文學缔恳,所以也不...
    爬爬蟲視界閱讀 719評論 0 2