利用Ajax+正则表达式+BeautifulSoup爬取今日头条街拍图集

  • 目标站点分析

    今日头条这类的网站制作,从数据形式,CSS样式都是通过数据接口的样式来决定的,所以它的抓取方法和其他网页的抓取方法不太一样,对它的抓取需要抓取后台传来的JSON数据,

  先来看一下今日头条的源码结构:我们抓取文章的标题,详情页的图片链接试一下:

看到上面的源码了吧,抓取下来没有用,那么我看下它的后台数据:‘

所有的数据都在后台的JSON展示中,所以我们需要通过接口对数据进行抓取

提取网页JSON数据

执行函数结果,如果你想大量抓取记得开启多进程并且存入数据库:

看下结果:

总结一下:网上好多抓取今日头条的案例都是先抓去指定主页,获取文章的URL再通过详情页,接着在详情页上抓取,但是现在的今日头条的网站是这样的,在主页的接口数据中就带有详情页的数据,通过点击跳转携带数据的方式将数据传给详情页的页面模板,这样开发起来方便节省了不少时间并且减少代码量

  • 流程框架

  • 爬虫实战

  1. spider详情页

    import json
    import os
    from hashlib import md5
    from json import JSONDecodeError import pymongo
    import re
    from urllib.parse import urlencode
    from multiprocessing import Pool import requests
    from bs4 import BeautifulSoup
    from config import * client = pymongo.MongoClient(MONOGO_URL, connect=False)
    db = client[MONOGO_DB] def get_page_index(offset,keyword): #请求首页页面html
    data = {
    'offset': offset,
    'format': 'json',
    'keyword': keyword,
    'autoload': 'true',
    'count': 20,
    'cur_tab': 3,
    'from': 'search_tab'
    }
    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 Exception:
    print('请求首页出错')
    return None def parse_page_index(html): #解析首页获得的html
    data = json.loads(html)
    if data and 'data' in data.keys():
    for item in data.get('data'):
    yield item.get('article_url') def get_page_detalil(url): #请求详情页面html
    headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'} try:
    response = requests.get(url,headers = headers)
    if response.status_code == 200:
    return response.text
    return None
    except Exception:
    print('请求详情页出错',url)
    return None def parse_page_detail(html,url): #解析每个详情页内容
    soup = BeautifulSoup(html,'lxml')
    title = soup.select('title')[0].get_text()
    image_pattern = re.compile('gallery: JSON.parse\("(.*)"\)',re.S)
    result = re.search(image_pattern,html)
    if result:
    try:
    data = json.loads(result.group(1).replace('\\',''))
    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)
    return {
    'title':title,
    'url':url,
    'images':images
    }
    except JSONDecodeError:
    pass def save_to_mongo(result): #把信息存储导Mongodb
    try:
    if db[MONOGO_TABLE].insert(result):
    print('存储成功',result)
    return False
    return True
    except TypeError:
    pass def download_image(url): #查看图片链接是否正常获取
    headers = {
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'}
    print('正在下载:',url)
    try:
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
    save_image(response.content)
    return None
    except ConnectionError:
    print('请求图片出错', url)
    return None def save_image(content): #下载图片到指定位置 #file_path = '{}/{}.{}'.format(os.getcwd(),md5(content).hexdigest(),'jpg')
    file_path = '{}/{}.{}'.format('/Users/darwin/Desktop/aaa',md5(content).hexdigest(),'jpg')
    if not os.path.exists(file_path):
    with open(file_path,'wb') as f:
    f.write(content)
    f.close() def main(offset):
    html = get_page_index(offset,KEYWORD)
    for url in parse_page_index(html):
    html = get_page_detalil(url)
    if html:
    result = parse_page_detail(html,url)
    save_to_mongo(result) if __name__ == '__main__':
    groups = [x*20 for x in range(GROUP_START,GROUP_END+1)]
    pool = Pool() pool.map(main,groups)
  2. config配置页

    MONOGO_URL='localhost'
    MONOGO_DB = 'toutiao'
    MONOGO_TABLE = 'toutiao' GROUP_START=1
    GROUP_END=2 KEYWORD='街拍'

PYTHON 爬虫笔记九:利用Ajax+正则表达式+BeautifulSoup爬取今日头条街拍图集(实战项目二)的更多相关文章

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

    流程框架: 抓取索引页内容:利用requests请求目标站点,得到索引网页HTML代码,返回结果. 抓取详情页内容:解析返回结果,得到详情页的链接,并进一步抓取详情页的信息. 下载图片与保存数据库:将 ...

  2. Python 爬虫爬取今日头条街拍上的图片

    # 今日头条--街拍 import requests from urllib.parse import urlencode import os from hashlib import md5 from ...

  3. 爬虫七之分析Ajax请求并爬取今日头条

    爬取今日头条图片 这里只讨论出现的一些问题,代码在最下面github链接里. 首先,今日头条取消了"图集"这一选项,因此对于爬虫来说效率降低了很多: 在所有代码都完成后,也许是爬取 ...

  4. 分析 ajax 请求并抓取今日头条街拍美图

    首先分析街拍图集的网页请求头部: 在 preview 选项卡我们可以找到 json 文件,分析 data 选项,找到我们要找到的图集地址 article_url: 选中其中一张图片,分析 json 请 ...

  5. 【Python爬虫案例学习】分析Ajax请求并抓取今日头条街拍图片

    1.抓取索引页内容 利用requests请求目标站点,得到索引网页HTML代码,返回结果. from urllib.parse import urlencode from requests.excep ...

  6. Python爬虫系列-分析Ajax请求并抓取今日头条街拍图片

    1.抓取索引页内容 利用requests请求目标站点,得到索引网页HTML代码,返回结果. 2.抓取详情页内容 解析返回结果,得到详情页的链接,并进一步抓取详情页的信息. 3.下载图片与保存数据库 将 ...

  7. 【Python3网络爬虫开发实战】6.4-分析Ajax爬取今日头条街拍美图【华为云技术分享】

    [摘要] 本节中,我们以今日头条为例来尝试通过分析Ajax请求来抓取网页数据的方法.这次要抓取的目标是今日头条的街拍美图,抓取完成之后,将每组图片分文件夹下载到本地并保存下来. 1. 准备工作 在本节 ...

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

    前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:haoxuan10 本节中,我们以今日头条为例来尝试通过分析Ajax请求 ...

  9. 转:【Python3网络爬虫开发实战】6.4-分析Ajax爬取今日头条街拍美图

    [摘要] 本节中,我们以今日头条为例来尝试通过分析Ajax请求来抓取网页数据的方法.这次要抓取的目标是今日头条的街拍美图,抓取完成之后,将每组图片分文件夹下载到本地并保存下来. 1. 准备工作 在本节 ...

随机推荐

  1. C++课程资源下载问题

    [来信] 贺老师,您好,我是江西某高校软件学院的一名在校学生.看了您在csdn上公布的博文和视频,我获益良多.不得不承认,之前的大学时光我是荒废了,立即就要大三了,我主攻的是C++方面.因此我悔过自新 ...

  2. RMQ(区间求最值)

    1. 概述 RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A.回答若干询问RMQ(A,i,j)(i,j<=n).返回数列A ...

  3. Solidworks如何生成爆炸图

    1 自动爆炸 点击"爆炸视图"按钮,然后全部选中装配体(被选中的零件会变为蓝色,全部选中即全部变色)然后在组成偶尔的爆炸窗口中下拉,点击应用.   再点击完成   回到装配体面板, ...

  4. React Native 三:样式

    一.声明和使用样式 1.React Native里面的样式和使用如以下所看到的.StyleSheet.create这个构造函数不是必须的. index.android.js文件 import Reac ...

  5. 关于郭天祥51开发板无法烧敲代码问题的解决(Prolific USB-to-Serial Comm Port)

    1. 事件背景: 因为使用了win8系统,之前购买的郭天祥C51开发板在通过一个两头都是usb口的下载线下载程序时出现了问题:下载工具stc isp无法连接到开发板上的串口,所以无法下载程序到c51开 ...

  6. php的一个小坑,输出不了json_encode

    明明是旧代码,怎么换个地方就不执行了.一开始怀疑是Php的版本. 最后才知道是我的编辑器nodepad++给坑了.或许不是nodepad++的坑.总之,需要转化为utf-8格式编码即可

  7. msgsnd的一个小问题

    今天写了一个System V消息队列的小样例.定义了一个例如以下的结构体: #define MSG_SIZE 8192 struct request { long mtype; int client_ ...

  8. Bootstrap--常用及实例合集

    栅格系统 1. row必须放到container和container-fluid里面        2. 你的内容应当放置于“列(column)”内,并且,只有“列(column)”可以作为行(row ...

  9. oracle中视图V$PGA_TARGET_ADVICE的用法

    看一下这个视图能给我们带来什么样的信息(视图中每个列都很有帮助):sys@ora10g> SELECT   pga_target_for_estimate / 1024 / 1024 " ...

  10. Android----SharedPreferences(存储数据)

    SharedPreferences详解 我们在开发软件的时候,常需要向用户提供软件参数设置功能,例如我们常用的微信,用户可以设置是否允许陌生人添加自己为好友.对于软件配置参数的保存,如果是在windo ...