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)


猜你喜欢

转载自blog.csdn.net/qq_42514453/article/details/82847815
今日推荐