利用Python3解析Ajax爬取今日頭條圖集

本文內(nèi)容參考來自:

1.分析Ajax抓取今日頭條街拍美圖

2.爬蟲學(xué)習(xí)-爬取今日頭條圖集

今日頭條街拍圖集首頁是利用ajax異步加載方式加載數(shù)據(jù)。

詳情頁組圖的URL在html頁面的javascript中,使用正則表達(dá)式匹配。

街拍圖集首頁
街拍圖集首頁請求參數(shù)
返回json格式數(shù)據(jù)
返回json數(shù)據(jù)的data中某一項
詳情頁組圖的URL

完整代碼如下:

1.toutiao_spider.py (爬取圖片并且下載到本地,同時保存信息到mongoDB中)

#-*- coding: utf-8 -*-
import re
from urllib.parse import urlencode
import pymongo
from requests.exceptions import RequestException
from bs4 import BeautifulSoup
import requests
import json
import os
from hashlib import md5
from Mongo_config import *
from multiprocessing import Pool

client = pymongo.MongoClient(MONGO_URL, connect=False)
db  = client[MONGON_DB]

headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0',
        'Content-Type': 'application/x-www-form-urlencoded',
        'Connection': 'Keep-Alive',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
    }

#獲取頁面信息
def get_page_index(offset, keyword):
    data = {
        'offset': offset,
        'format': 'json',
        'keyword': keyword,
        'autoload': 'true',
        'count': 20,
        'cur_tab': 1,
        'from':'gallery'
    }

    url = 'https://www.toutiao.com/search_content/?' + urlencode(data)
    try:
        response = requests.get(url, headers = headers)
        if response.status_code == 200:
            return response.text
        return None
    except RequestException:
        print('請求索引出錯')
        return None

#索引
def parse_page_index(html):
    data = json.loads(html)
    if data and 'data' in data.keys():
        for item in data.get('data'):
            yield item.get('article_url')

#獲取詳情頁信息
def get_page_detail(url):
    try:
        response = requests.get(url, headers = headers)
        if response.status_code == 200:
            return response.text
        return None
    except RequestException:
        print('請求詳情頁出錯', url)
        return None

# 獲取頁面詳情
def parse_page_detail(html, url):
    soup = BeautifulSoup(html, 'lxml')
    # 獲取標(biāo)題
    title = soup.select('title')[0].get_text()
    # 圖片正則表達(dá)式對象
    images_pattern = re.compile('gallery: JSON.parse\("(.*?)"\)', re.S)
    result = re.search(images_pattern, html)
    # 替換不需要的數(shù)據(jù)
    json_images = re.sub(r'\\{1,2}', '', result.group(1))
    if  result:
         images_data = json.loads(json_images)
         if images_data and 'sub_images' in images_data.keys():
             sub_images = images_data.get('sub_images')
             # 轉(zhuǎn)換成數(shù)組
             images = [item.get('url') for item in sub_images]
             # 下載圖片
             for image in images: down_load_images(image)
             return{
                'title': title,
                'url': url,
                'images': images
             }

# 下載圖片
def down_load_images(url):
    print('正在下載',url)
    try:
        response = requests.get(url, headers = headers)
        if response.status_code == 200:
            save_images(response.content)
        return None
    except RequestException:
        print('請求圖片出錯', url)
        return None

# 存儲圖片
def save_images(content):
    file_path = '{0}/{1}.{2}'.format(os.getcwd(), md5(content).hexdigest(), 'jpg')
    if not os.path.exists(file_path):
        with open(file_path, 'wb') as f:
            f.write(content)
            f.close()

# 存儲到mongoDB
def save_to_mongo(result):
    if db[MONGO_TABLE].insert(result):
        print('存儲成功', result)
        return True
    return False

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

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

2.Mongo_config (定義Mongodb全局配置信息)

#-*- coding: utf-8 -*-
MONGO_URL = 'localhost'
MONGON_DB = 'toutiao'
MONGO_TABLE = 'toutiao'

# 如果沒有mongodb密碼就不用寫數(shù)據(jù)庫密碼了,如果有就需要填寫一下
GROUP_START = 1
GROUP_END = 20
KEYWORD = '街拍'

3、運(yùn)行結(jié)果


Pycharm運(yùn)行結(jié)果

下載到本地

保存信息到Mongodb
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末躺枕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子供填,更是在濱河造成了極大的恐慌拐云,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件近她,死亡現(xiàn)場離奇詭異叉瘩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)粘捎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門薇缅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人攒磨,你說我怎么就攤上這事泳桦。” “怎么了娩缰?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵灸撰,是天一觀的道長。 經(jīng)常有香客問我,道長浮毯,這世上最難降的妖魔是什么完疫? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮亲轨,結(jié)果婚禮上趋惨,老公的妹妹穿的比我還像新娘鸟顺。我一直安慰自己惦蚊,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布讯嫂。 她就那樣靜靜地躺著蹦锋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪欧芽。 梳的紋絲不亂的頭發(fā)上莉掂,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機(jī)與錄音千扔,去河邊找鬼憎妙。 笑死,一個胖子當(dāng)著我的面吹牛曲楚,可吹牛的內(nèi)容都是我干的厘唾。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼龙誊,長吁一口氣:“原來是場噩夢啊……” “哼抚垃!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起趟大,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤鹤树,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后逊朽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體罕伯,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年叽讳,在試婚紗的時候發(fā)現(xiàn)自己被綠了捣炬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡绽榛,死狀恐怖湿酸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情灭美,我是刑警寧澤推溃,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站届腐,受9級特大地震影響铁坎,放射性物質(zhì)發(fā)生泄漏蜂奸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一硬萍、第九天 我趴在偏房一處隱蔽的房頂上張望扩所。 院中可真熱鬧,春花似錦朴乖、人聲如沸祖屏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽袁勺。三九已至,卻和暖如春畜普,著一層夾襖步出監(jiān)牢的瞬間期丰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工吃挑, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留钝荡,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓舶衬,卻偏偏與公主長得像埠通,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子约炎,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容