多线程高容错爬头条街拍美图

  • 分析头条的ajax,通过正则表达式,python3多线程高容错爬取头条的街拍美图,保存到mongodb,并下载图片
  • 头条的内容网页较之前已经改版,图床页不仅有ajax的还有html的内容网页
  • 所以使用了两种正则,根据条件调用
  • #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    """
    @author:Aiker
    @file:toutiao.py
    @time:下午9:35
    """
    import json
    import os
    import re
    from json import JSONDecodeError
    from multiprocessing import Pool
    from urllib.parse import urlencode
    from hashlib import md5
    import pymongo
    import requests
    from requests.exceptions import RequestException
    
    MONGO_URL = ‘localhost:27017‘
    MONGO_DB = ‘toutiao‘
    MONGO_TABLE = ‘toutiao‘
    GROUP_START = 1
    GROUP_END = 20
    KEYWORD = ‘街拍‘
    client = pymongo.MongoClient(MONGO_URL, connect=False)
    db = client[MONGO_DB]
    
    headers = {
        ‘user-agent‘: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36‘
    
    }
    
    def get_url(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 get_page_index(offset, keyword):
        data = {
            ‘aid‘: ‘24‘,
            ‘app_name‘: ‘web_search‘,
            ‘offset‘: offset,
            ‘format‘: ‘json‘,
            ‘keyword‘: keyword,
            ‘autoload‘: ‘true‘,
            ‘count‘: ‘20‘,
            ‘en_qc‘: ‘1‘,
            ‘cur_tab‘: ‘1‘,
            ‘from‘: ‘search_tab‘,
            ‘pd‘: ‘synthesis‘,
            ‘timestamp‘: ‘1124216535987‘
        }
        url = ‘https://www.toutiao.com/api/search/content/?‘ + urlencode(data)  # 字典对象转化url对象
        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):
        try:
            data = json.loads(html)  # 转化为json对象
            if data and ‘data‘ in data.keys():
                # print(data.keys()) #调试,输出所有key
                for item in data.get(‘data‘):
                    if ‘article_url‘ in item:  # 判断是否存在,避免出现None
                        # print(item)
                        yield item.get(‘article_url‘)  # 构造生成器
        except JSONDecodeError:
            pass
        except TypeError:
            pass
    
    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):
        pattern = re.compile("articleInfo:.*?title:\s‘(.*?)‘,.*?content:\s‘(.*?)‘.*?groupId", re.S)
        result = re.findall(pattern, html)
        # print(tc)
        if result:
            title, content = result[0]
            pattern = re.compile("(http://.*?)"", re.S)
            images = re.findall(pattern, content)
            # print(img)
            for image in images: download_image(image, title)
            # print(item)
            return {
                ‘title‘: title,
                ‘url‘: url,
                ‘images‘: images
            }
        else:
            pattern = re.compile(‘BASE_DATA.galleryInfo.*?title:\s\‘(.*?)\‘.*?gallery: JSON.parse\("(.*)"\)‘, re.S)
            result = re.findall(pattern, html)
            # print(result[0])
            if result:
                title, content = result[0]
                data = json.loads(content.replace(‘\\‘, ‘‘))
                # print(data)
                if data and ‘sub_images‘ in data.keys():
                    sub_images = data.get(‘sub_images‘)
                    images = [item.get(‘url‘) for item in sub_images]
                    for image in images: download_image(image,title)
                    return {
                        ‘title‘: title,
                        ‘url‘: url,
                        ‘images‘: images
                    }
    
    def save_to_mongo(result):
        if db[MONGO_TABLE].insert(result):
            print(‘存储到MongoDB成功‘, result)
            return True
        return False
    
    def download_image(url,title):
        print(‘正在下载‘, url)
        try:
            response = requests.get(url)
            if response.status_code == 200:
                save_image(response.content,title)
            return None
        except RequestException:
            print(‘请求图片出错‘, url)
            return None
    
    def save_image(content,title):
        try:
            if title:
                title = re.sub(‘[:?!!:?]‘, ‘‘, title)  # 替换title中的特殊字符,避免建立资料夹目录出错
            dir = ‘z:\\toutiao\\‘
            if os.path.exists(dir + title):
                pass
            else:
                os.mkdir(dir + title)
            file_path = ‘{0}/{1}.{2}‘.format( dir + title, md5(content).hexdigest(), ‘jpg‘)
            if not os.path.exists(file_path):
                with open(file_path, ‘wb‘) as f:
                    f.write(content)
                    f.close()
        except OSError:
            pass
    
    def main(offset):
        html = get_page_index(offset, KEYWORD)
        for url in parse_page_index(html):
            print(url)
            html = get_page_detail(url)
            if html:
                result = parse_page_detail(html, url)
                if result:
                    save_to_mongo(result)
    
        # print(html)
    
    if __name__ == ‘__main__‘:
        # main()
        groups = [x * 20 for x in range(GROUP_START, GROUP_END + 1)]
        pool = Pool()
        pool.map(main, groups)
        pool.close()
        pool.join()
    
    • 下载图片,并保存到mongodb

    原文地址:https://blog.51cto.com/m51cto/2374411

    时间: 2024-10-03 19:17:29

    多线程高容错爬头条街拍美图的相关文章

    芝麻HTTP:分析Ajax爬取今日头条街拍美图

    本节中,我们以今日头条为例来尝试通过分析Ajax请求来抓取网页数据的方法.这次要抓取的目标是今日头条的街拍美图,抓取完成之后,将每组图片分文件夹下载到本地并保存下来. 1. 准备工作 在本节开始之前,请确保已经安装好requests库. 2.实战演练 首先,实现方法get_page()来加载单个Ajax请求的结果.其中唯一变化的参数就是offset,所以我们将它当作参数传递,实现如下: import requests from urllib.parse import urlencode def

    【Python3网络爬虫开发实战】 分析Ajax爬取今日头条街拍美图

    前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:haoxuan10 本节中,我们以今日头条为例来尝试通过分析Ajax请求来抓取网页数据的方法.这次要抓取的目标是今日头条的街拍美图,抓取完成之后,将每组图片分文件夹下载到本地并保存下来. 准备工作在本节开始之前,请确保已经安装好requests库.如果没有安装,可以参考第1章.另外如果你对python的库不是很熟的话,建议先去小编的Python交流.裙 :一久武其而而流

    Ajax爬取今日头条街拍美图

    1.打开今日头条:https://www.toutiao.com 2.搜索街拍 3.检查元素,查看请求发现在URL中每次只有offset发生改变,是一个get请求 1 import requests 2 from urllib.parse import urlencode 3 import os 4 from hashlib import md5 5 from multiprocessing.pool import Pool 6 7 def get_page(offset): 8 params

    分析Ajax爬取今日头条街拍美图

    1 import os 2 import requests 3 from urllib.parse import urlencode 4 from hashlib import md5 5 from multiprocessing.pool import Pool 6 7 GROUP_START = 1 8 GROUP_END = 5 9 10 def get_page(offset): 11 params = { 12 'offset': offset, 13 'format': 'json'

    ajax分析-今日头条街拍美图抓取

    我们知道,有时候直接利用requests请求得到的原始数据是无效的,因为很多时候,这样获取的一个网页的源代码很可能就几行,明显不是我们想要的东西,这个时候,我们就可以分析,这样的网页中是不是加入了ajax请求,即原始页面加载完成后,会再向服务器请求某个接口去获取数据,然后才被呈现到网上的. ajax并不是一门语言,而是一门技术,它可以在页面不被刷新的情况下,利用javascript进行数据交换,渲染网页进而呈现,我们平时用手机刷微博,往下拉就会出现加载的小圆圈,那个就是加入了ajax请求. 所以

    分析Ajax请求并抓取今日头条街拍美图

    通常我们从网页上爬取内容时,都是HTML代码,内容都已经写好了,直接从页面获取想要的信息即可,但是有的网页是通过ajax获取的数据,将ajax获取的数据通过json格式接受,然后展示在页面上的,也就是说,当我们打开一个页面时,首先请求的是他的html,然后HTML里面通过ajax获取后端数据,将数据以json格式展示在页面上.而近日头条就是这样.下面我们来看看. 我们打开链接:https://www.toutiao.com/search/?keyword=%E8%A1%97%E6%8B%8D,我

    Python-爬虫-抓取头条街拍图片-1.1

    下面实例是抓取头条图片信息,只是抓取了查询列表返回的json中image,大图标,由于该结果不会包含该链接详情页的所有图片列表:因此这里抓取不全:后续有时间在完善: 1.抓取头条街拍相关图片请求如下: 2.通过debug可以看到请求参数以及相应结果数据: 3.响应结果,比较重要的是data(group_id,image_list.large_image_url等字段): 主程序如下: 抓取图片信息保存本地,然后将图片组和图片信息保存至mysql数据库: 1 #今日头条街拍数据抓取,将图片存入文件

    ajax爬取今日头条街拍图片——data出现none的解决

    之前爬取总是出现如图的结果:手动打开url显示的是想要的结果,但是爬取的时候data为空 尝试了多种方法,偶然得到了想要的结果: 这是多次实验中成功与不成功结果中构造的url 发现 1)得到想要结果,所构造的url中keyword=******与下一参数间没有&链接 2)同样的keyword=%E8%A1%97%E6%8B%8D,参用不同的方式:‘https://www.toutiao.com/api/search/content/?keyword=%E8%A1%97%E6%8B%8D’+url

    人人都使用美颜自拍 美图公司却亏损越来越多?

    最近有网友罗列了人类自拍的演变历,会心一笑之余才发现,原来自拍有如此深厚的历史渊源.而说到自拍,许多人的第一反应就是"一键美颜"或者"美图秀秀",今年初市场已有"美图秀秀"开发商美图公司将上市的消息,早前美图公司已向港交所递交表格,最新消息指,美图公司已通过上市聆讯,并将在下周开始路演,12月初公开招股,预计集资最多8亿美元,折合约62.4亿港元. 事实上早在2014年,美图公司就已经完成了A.B.C三轮融资,融资总额3.6亿美元,C轮融资后公司