1. 程式人生 > >python爬蟲-使用多程序爬取美圖-人工智慧語言(高效爬蟲)

python爬蟲-使用多程序爬取美圖-人工智慧語言(高效爬蟲)

import os
from multiprocessing.pool import Pool
from urllib.parse import urlencode
from hashlib import md5
import requests


def loaDpage(fullurl):
    """
    負責發請求獲取圖片url
    :return:
    """
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36"
        }
    response = requests.get(fullurl, headers=headers)

    jsonFile = response.json()   # 該方法返回json格式檔案

    這裡可以把獲取到的json檔案寫入本地,便於接下來解析
    with codecs.open('jiepai1.json', 'wb', encoding='utf-8') as f:
        source = json.dumps(response.json(), ensure_ascii=False) + '\n'
        f.write(source)

    parsePage(jsonFile)


def parsePage(jsonFile):

    if jsonFile.get('data'):

        # 先獲取data資料,
        data = jsonFile.get('data')

        for i in data:
            # 分析發現data是一個列表,列表裡嵌套了字典

            if i.get('image_list'):
                # 獲取每一條圖片url資料
                for url in i.get('image_list'):
                # 這裡獲取到的url中有的不是我們需要的美圖,進行過濾     
                    if type(url) == dict:
                        # 這裡拿到的url只是縮圖的url,我們進行替換以及url的拼接
                        new_url = 'http:' + url.get('url').replace('list', 'large')
                        writePage(new_url)


def writePage(new_url):
    """
    負責寫入本地檔案
    :return:
    """
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36"
        }
    # 請求每一張圖片
    response = requests.get(new_url, headers=headers)

    data = response.content  # content方法得到二進位制圖片檔案
    
    fileName = md5(data).hexdigest() + '.jpg'  # 使用md5並且對圖片進行命名
    
    with open(fileName, 'wb') as f:
        f.write(data)

# def spiderMeinv(beginPage, endPage):
def spiderMeinv(offset):
    """
    排程執行
    :return:
    """
    # 這裡使用抓包工具把ajax請求的引數列舉出來便於大家分析
    #     # offset=60
    # &format=json&
    # keyword=%E8%A1%97%E6%8B%8D%E7%BE%8E%E5%A5%B3&
    # autoload=true&
    # count=20
    # &cur_tab=1&
    # from=search_tab

        
    data = {
        'offset': offset,
        'format': 'json',
        'keyword': '街拍美女',
        'autoload': 'true',
        'count': '20',
        'cur_tab': '1',
        'from': 'search_tab'
    }
    url = 'https://www.toutiao.com/search_content/?'
    datas = urlencode(data)
    fullurl = url + datas
    loaDpage(fullurl)


if __name__ == '__main__':

    # 接收使用者輸入
    beginPage = int(input('輸入起始頁:'))
    endPage = int(input('輸入結束頁:'))

    # 準備基礎資料
    url = 'https://www.toutiao.com/search_content/?'
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36"
 }

    # 建立資料夾存放美圖,切換工作目錄
    if not os.path.exists('jiepai'):
        os.mkdir('jiepai')
        os.chdir('jiepai')
    
    groups = [x * 20 for x in range(beginPage, endPage + 1)]
    pool = Pool(5)
    # 這裡pool.map的兩個引數分別是要執行的函式名和一個可迭代物件,表示把可迭代物件中的所有的值一作為引數依次傳入函式中
    pool.map(spiderMeinv, groups)