Python 抓取今日頭條街拍圖集

# -*- coding:utf-8 -*-
# 抓取今日頭條街拍圖集
import json
from multiprocessing import Pool
from urllib.parse import urlencode
import pymysql
import requests
import re
from bs4 import BeautifulSoup
import os
from requests.exceptions import RequestException

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36"
    , "accept-language": "zh-CN,zh;q=0.9"
    , "accept-encoding": "gzip"}

# 抓取頁面所需參數(shù)
GROUP_START=0
GROUP_END=20
KEYWORD='街拍'

# MySQL 數(shù)據(jù)庫配置
HOST = 'localhost'
DB = 'sys'
UNAME = 'root'
PWD = ''
PORT = 3306


# 獲取索引頁
def get_page_index(offset,keyword):
    data = {
        'offset': offset,
        'format': 'json',
        'keyword': keyword,
        'autoload': 'true',
        'count': '20',
        'cur_tab': '3',
        'from': 'gallery'
    }
    # 構(gòu)建要抓取的頁面URL
    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("請求索引頁出錯")
        return None

# 獲取索引頁內(nèi)容,獲取所有圖集url
def parse_page_index(html):
    data = json.loads(html) # 將html轉(zhuǎn)換為json
    if data and 'data' in data:
        for item in data.get('data'):
            yield item.get('article_url')

# 獲取詳情頁內(nèi)容
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

# 通過BeautifulSoup解析詳情頁內(nèi)容
def parse_page_detail(html,url):
    soup = BeautifulSoup(html,'html.parser')
    try:
        title = soup.select('title')[0].text
        print(title)
        pattern = re.compile('JSON.parse\("(.*?)\),') # 通過正則抓取相關(guān)js內(nèi)容
        result = re.search(pattern,html)
    except Exception:
        print('解析頁面異常。')
        return None
    if result:
        res = result.group(1).replace('\\','')
        pattern = re.compile('"url":"(.*?)"')
        urls1 = re.findall(pattern,res)
        urls2 = []
        [urls2.append(i) for i in urls1 if not i in urls2] # 去重

        # 下載圖片并將數(shù)據(jù)保存到MYSQL
        for image_url in urls2:
            download_image(image_url)
            save_to_mysql({
                'title': title,
                'url': url,
                'image_url': image_url
            })

        return {
            'title':title,
            'url':url,
            'images':urls2
        }

# 下載圖片
def download_image(url):
    try:
        response  = requests.get(url,headers = headers)
        filename = url.split('/')[-1]
        if response.status_code == 200:
            save_image(response.content,filename)
            # return response.text
        return None
    except RequestException:
        print("請求圖片頁錯誤",url)
        return None

# 保存圖片文件
def save_image(content,filename):
    file_path = '{0}/{1}.{2}'.format(os.getcwd()+"/toutiaojiepai",filename,'jpg')
    print("正在下載:",file_path)
    if not os.path.exists(file_path):
        with open(file_path,'wb') as f:
            f.write(content)
            f.close()

# 圖片信息保存到數(shù)據(jù)庫
def save_to_mysql(data):
    try:
        conn = pymysql.connect(host=HOST, port=PORT, user=UNAME, password=PWD, db=DB,
                               charset="utf8")
        cursor = conn.cursor()
        insert_sql = 'insert into meituijiepai values("'+data["title"]+'","'+data['image_url']+'")'
        print(insert_sql)
        cursor.execute(insert_sql)
        conn.commit()
        cursor.close()
        conn.close()
    except Exception as e:
        print('wrong' + e)


# 創(chuàng)建目錄
def mkdir(path):
    path = path.strip()
    path = path.rstrip("\\")
    is_exists = os.path.exists(path)
    if not is_exists:
        os.makedirs(path)
        print(path + ' 創(chuàng)建成功')
        return True
    else:
        print(path + ' 目錄已存在')
        return False

def main(offset):
    print("開始:"+str(offset),KEYWORD)
    html = get_page_index(offset,KEYWORD)
    mkdir(os.getcwd() + "/toutiaojiepai")
    for url in parse_page_index(html):
        html = get_page_detail(url)
        result = parse_page_detail(html,url)
        print(result)

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

效果如下:


QQ截圖20181226121804.png
QQ截圖20181226121934.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末企蹭,一起剝皮案震驚了整個濱河市狭姨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異槐臀,居然都是意外死亡,警方通過查閱死者的電腦和手機氓仲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門水慨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人敬扛,你說我怎么就攤上這事晰洒。” “怎么了啥箭?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵谍珊,是天一觀的道長。 經(jīng)常有香客問我急侥,道長砌滞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任坏怪,我火速辦了婚禮贝润,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘铝宵。我一直安慰自己打掘,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布鹏秋。 她就那樣靜靜地躺著尊蚁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪侣夷。 梳的紋絲不亂的頭發(fā)上横朋,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機與錄音惜纸,去河邊找鬼叶撒。 笑死,一個胖子當(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
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有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
  • 我被黑心中介騙來泰國打工八匠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留絮爷,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓梨树,卻偏偏與公主長得像坑夯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子抡四,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,834評論 2 345

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