Python的Requests来爬取今日头条的图片和文章

简介: Python的Requests来爬取今日头条的图片和文章

Python的Requests来爬取今日头条的图片和文章并且存入mongo

config.py

MONGO_HOST = 'localhost'
MONGO_PORT = 27017
MONGO_DB = 'toutiao'
MONGO_TABLE = 'toutiao'
GROUP_START = 1
GROUP_END = 20
KEYWORD = '原油'

toutiao.py

import json
import os
from urllib.parse import urlencode
import pymongo
import requests
from multiprocessing import Pool
from requests.exceptions import ConnectionError
from hashlib import md5
from config import *
client = pymongo.MongoClient(MONGO_HOST, MONGO_PORT)
db = client[MONGO_DB]
def get_page_index(offset, keyword):
    data = {
        'autoload': 'true',
        'count': 20,
        'cur_tab': 1,
        'app_name': 'web_search',
        'format': 'search_tab',
        'keyword': keyword,
        'offset': offset,
    }
    params = urlencode(data)
    base = 'https://www.toutiao.com/api/search/content'
    url = base + '?' + params
    try:
        response = requests.get(url)
        if response.status_code == 200:
            data = json.loads(response.text)
            if data  and 'data' in data.keys():
                if data.get('data') is not None:
                    for item in data.get('data'):
                        if item is not None:
                           yield [item.get('article_url'), item.get('abstract'), item.get('large_image_url')]
    except ConnectionError:
        print('Error occurred')
        return None
def download_image(url):
    print('Downloading', url)
    try:
        response = requests.get(url)
        if response.status_code == 200:
            save_image(response.content)
        return None
    except Exception:
        return None
def save_image(content):
    file_path = '{0}/picture/{1}.{2}'.format(os.getcwd(), md5(content).hexdigest(), 'jpg')
    print(file_path)
    if not os.path.exists(file_path):
        with open(file_path, 'wb') as f:
            f.write(content)
            f.close()
def save_to_mongo(result):
    if db[MONGO_TABLE].insert_one(result):
        print('Successfully Saved to Mongo', result)
        return True
    return False
def main(offset):
    items = get_page_index(offset, KEYWORD)
    for item in items:
            if (item[2] is not None) and len(item[2])!=0:
                download_image(item[2])
            if (item[0] is not None and len(item[0]) != 0)\
                    or  (item[1] is not None and len(item[1]) != 0)\
                    or  (item[2] is not None and len(item[2]) != 0):
                json = {
                    'article_url': item[0],
                    'abstract': item[1],
                    'large_image_url': item[2]
                }
                save_to_mongo(json)
if __name__ == '__main__':
    pool = Pool()
    groups = ([x * 20 for x in range(GROUP_START, GROUP_END + 1)])
    pool.map(main, groups)
    pool.close()
    pool.join()

知识拓展:

一、用Flask+Redis维护Cookies池

为什什么要⽤用Cookies池

⽹网站需要登录才可爬取,例例如新浪微博

爬取过程中如果频率过⾼高会导致封号

需要维护多个账号的Cookies池实现⼤大规模爬取

Cookies池的要求

⾃自动登录更更新

定时验证筛选

提供外部接⼝口

代码:https://github.com/Python3WebSpider/CookiesPool

二、用Flask+Redis维护代理池

为什么要⽤用代理理池?

许多⽹网站有专⻔门的反爬⾍虫措施,可能遇到封IP等问题。

互联⽹网上公开了了⼤大量量免费代理理,利利⽤用好资源。

通过定时的检测维护同样可以得到多个可⽤用代理理。

代理理池的要求

多站抓取,异步检测

定时筛选,持续更更新

提供接⼝口,易易于提取

 

代码:https://github.com/Python3WebSpider/ProxyPool

三、VirtualEnv

  Virtualenv他最大的好处是,可以让每一个python项目单独使用一个环境,而不会影响python系统环境,也不会影响其他项目的环境。

安装,virtualenv本质上是个python包, 使用pip安装:

pip install virtualenv

在工作目录下创建虚拟环境(默认在当前目录):注意需要自定义虚拟环境的名字!

~$virtualenv TestEnv
New python executable in ~/TestEnv/bin/python
Installing setuptools, pip, wheel...done.

默认情况下, 虚拟环境中不包括系统的site-packages, 若要使用请添加参数:

语法:virtualenv --system-site-packages TestEnv

使用virtualenv默认python版本创建虚拟环境

语法:virtualenv --no-site-packages ubuntu_env

四、url去重策略


相关文章
|
2月前
|
数据采集 Python
爬虫实战-Python爬取百度当天热搜内容
爬虫实战-Python爬取百度当天热搜内容
72 0
|
20小时前
|
存储 索引 Python
python图片九宫格图片处理
本篇文章介绍了一个Python项目的实现,项目能够处理图片并将其组合成九宫格或四宫格,同时还具备音乐播放功能,对于初学者来说是一个可以进行实战学习的初级项目。
17 5
|
21小时前
|
存储 计算机视觉 Python
python实现Gif图片的字符画
这是一个Python实战项目,旨在将GIF动态图转化为ASCII字符动画。项目适合有一定Python基础的学习者,主要使用os、imageio、PIL库。首先,代码导入所需库,然后通过PIL创建空白图片并添加文本。接着,程序读取GIF,拆分帧并转为字符画,存入“tmp”目录。同时,代码提供了清空“tmp”目录、将灰度值映射为ASCII字符、将图片处理成字符画的函数。此外,还有创建新画布和合成GIF的步骤。主函数调用这些模块,最终将ASCII字符画合并成GIF。项目展示了将动态图像转换为ASCII艺术的过程。
13 0
|
4天前
|
Python
python代码根据点坐标裁切图片
【4月更文挑战第19天】python代码根据点坐标裁切图片
12 2
|
8天前
|
数据采集 数据可视化 数据处理
Python从入门到精通的文章3.3.1 深入学习Python库和框架:数据处理与可视化的利器
Python从入门到精通的文章3.3.1 深入学习Python库和框架:数据处理与可视化的利器
|
8天前
|
数据采集 存储 人工智能
【Python+微信】【企业微信开发入坑指北】4. 企业微信接入GPT,只需一个URL,自动获取文章总结
【Python+微信】【企业微信开发入坑指北】4. 企业微信接入GPT,只需一个URL,自动获取文章总结
25 0
|
10天前
|
数据采集 存储 JSON
Python爬虫面试:requests、BeautifulSoup与Scrapy详解
【4月更文挑战第19天】本文聚焦于Python爬虫面试中的核心库——requests、BeautifulSoup和Scrapy。讲解了它们的常见问题、易错点及应对策略。对于requests,强调了异常处理、代理设置和请求重试;BeautifulSoup部分提到选择器使用、动态内容处理和解析效率优化;而Scrapy则关注项目架构、数据存储和分布式爬虫。通过实例代码,帮助读者深化理解并提升面试表现。
15 0
|
12天前
|
Python
使用Python的Requests库进行网络请求和抓取网页数据
【4月更文挑战第20天】使用Python Requests库进行网络请求和网页数据抓取的步骤包括:安装库(`pip install requests`)、导入库、发送GET/POST请求、检查响应状态码、解析内容、处理Cookies、设置请求头以及异常处理。通过`response`对象访问响应信息,如`status_code`、`text`、`content`和`cookies`。可设置`headers`模拟用户代理,用`try-except`处理异常。
19 7
|
12天前
|
数据挖掘 API 数据安全/隐私保护
python请求模块requests如何添加代理ip
python请求模块requests如何添加代理ip
|
13天前
|
数据采集 Web App开发 开发者
探秘Python爬虫技术:王者荣耀英雄图片爬取
探秘Python爬虫技术:王者荣耀英雄图片爬取