分析AJAX抓取今日头条的街拍美图并把信息存入mongodb中
今天学习分析ajax 请求,现把学得记录,
把我们在今日头条搜索街拍美图的时候,今日头条会发起ajax请求去请求图片,所以我们在网页源码中不能找到图片的url,但是今日头条网页中有一个json 文件,这相文件中就包括单个图集的具体url,通过访问这个url ,又可以获取一个json 文件,这个json 文件中有个键是url_list 这个键的值是一个List ,这个list中就存入了具体单个图片的下载url ,通过request.get()方法去访问这个url ,然后把得到content以二进制的方式写入到本地,并把其他数据存入到mongodb中,
代码如下,
- import requests
- import json
- from urllib.parse import urlencode
- from requests.exceptions import RequestException
- import re
- from bs4 import BeautifulSoup
- from config import *
- import pymongo
- from hashlib import md5
- import os
- from multiprocessing import Pool
- def get_page_index(offset, keyword):
- """传入要数据,获得详情页面"""
- data = {
- "autoload": "true",
- "count": 20,
- "cur_tab": 3,
- "format": "json",
- "from": "gallery",
- "keyword": keyword,
- "offset": offset,
- }
- 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 RequestException:
- print("请求index页面失败")
- return None
- def parse_page_index(html):
- """头条街拍图片存在一个json中,json中的data就是单个图集的信息"""
- 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_detail(url):
- """获得单个图集url的信息"""
- try:
- response = requests.get(url)
- if response.status_code == 200:
- return response.text
- return None
- except RequestException:
- print("请求详情页面失败")
- return None
- def parse_page_detail(html, url):
- """解析单位个图集url的网页信息,因为信息存放于一个json文件中,这个json文件嵌套在html中,所以使用re解析"""
- # 先用BeautifulSoup获得title.
- soup = BeautifulSoup(html, "lxml")
- title = soup.select("title")[0].get_text()
- print(title)
- images_pattern = re.compile('parse\("(.*?)"\),', re.S)
- result = re.search(images_pattern, html)
- if result:
- data = result.group(1)
- data = json.loads(data)
- if data and "url_list" in data.keys():
- url_list = data.get("url_list")
- images = [item.get("url") for item in url_list]
- for image in images:
- # 调用函数下载图片到本地
- download_imag(image)
- # 返回数据,返回的数据存入mongodb
- return {
- "title": title,
- "images": images,
- "url": url,
- }
- def save_to_mongo(result):
- client = pymongo.MongoClient(MONGO_URL, connect=False)
- db = client[MONGO_DB]
- if db[MONGO_TABLE].insert(result):
- print("insert into mongo success", result)
- return True
- else:
- return False
- def download_imag(url):
- """# 下载图片到本地"""
- print("正在下载 :", url)
- try:
- response = requests.get(url)
- if response.status_code == 200:
- # response.content 返回二进制内容
- # response.text返回字符串
- save_image(response.content)
- except RequestException:
- print("请求图片失败", url)
- def save_image(content):
- """解析图片url的信息,把获得的信息写入本地文件中"""
- file_path = '{0}/{1}.{2}'.format(os.getcwd(), md5(content).hexdigest(), "jpg")
- if not os.path.exists(file_path):
- with open(file_path, "wb") as f:
- f.write(content)
- def main(offset):
- """主函数"""
- html = get_page_index(offset, KEYWORD)
- # 防止get_page_index没有取回数据
- if html is not None:
- for url in parse_page_index(html):
- html = get_page_detail(url)
- if html:
- result = parse_page_detail(html, url)
- save_to_mongo(result)
- print(result)
- else:
- print("get_page_index 函数没有取到数据")
- if __name__ == "__main__":
- """使用多进程加快速度"""
- groups = [x * 20 for x in range(GROUP_START, GROUP_END)]
- pool = Pool()
- pool.map(main, groups)
这个程度代码相对简单,逻辑清楚,程序之间参数传递及程序的跳转也不难,只是分析今日头条的ajax请求,及获得各个json文件相对复杂一点.
我把程度的配置信息写在config.py 这个文件中,这样方法之后程序的重用,
config.py 代码如下:
- MONGO_URL="localhost"
- MONGO_DB="toutiao"
- MONGO_TABLE="toutiao"
- GROUP_START = 1 # 定义起始循环点
- GROUP_END = 20 # 定义终止循环点
- KEYWORD="街拍"
通过这个程序,学会了分析,这种通过发起ajax请求而获取数据的网页的源码分析.这个程序不足的地方是,这个程序是用requsts库做的解析,程序会是用函数而不是类去实现,后续要把这个程序改用scrapy 库去实现.
分析AJAX抓取今日头条的街拍美图并把信息存入mongodb中的更多相关文章
- 分析 ajax 请求并抓取 “今日头条的街拍图”
今日头条抓取页面: 分析街拍页面的 ajax 请求: 通过在 XHR 中查看内容,获取 url 链接,params 参数信息,将两者进行拼接后取得完整 url 地址.data 中的 article_u ...
- 分析Ajax抓取今日头条街拍美图
spider.py # -*- coding:utf-8 -*- from urllib import urlencode import requests from requests.exceptio ...
- 关于爬虫的日常复习(9)—— 实战:分析Ajax抓取今日头条接拍美图
- python爬虫—— 抓取今日头条的街拍的妹子图
AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. 近期在学习获取j ...
- 【Python3网络爬虫开发实战】 分析Ajax爬取今日头条街拍美图
前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:haoxuan10 本节中,我们以今日头条为例来尝试通过分析Ajax请求 ...
- 爬虫—分析Ajax爬取今日头条图片
以今日头条为例分析Ajax请求抓取网页数据.本次抓取今日头条的街拍关键字对应的图片,并保存到本地 一,分析 打开今日头条主页,在搜索框中输入街拍二字,打开开发者工具,发现浏览器显示的数据不在其源码里面 ...
- 分析Ajax爬取今日头条街拍美图-崔庆才思路
站点分析 源码及遇到的问题 代码结构 方法定义 需要的常量 关于在代码中遇到的问题 01. 数据库连接 02.今日头条的反爬虫机制 03. json解码遇到的问题 04. 关于response.tex ...
- python多线程爬取-今日头条的街拍数据(附源码加思路注释)
这里用的是json+re+requests+beautifulsoup+多线程 1 import json import re from multiprocessing.pool import Poo ...
- python抓取伯乐在线的全部文章,对标题分词后存入mongodb中
依赖包: 1.pymongo 2.jieba # -*- coding: utf-8 -*- """ @author: jiangfuqiang "" ...
随机推荐
- 【Java学习笔记之十六】浅谈Java中的继承与多态
1. 什么是继承,继承的特点? 子类继承父类的特征和行为,使得子类具有父类的各种属性和方法.或子类从父类继承方法,使得子类具有父类相同的行为. 特点:在继承关系中,父类更通用.子类更具体.父类具有更 ...
- [51nod1610]路径计数
路径上所有边权的最大公约数定义为一条路径的值. 给定一个有向无环图. T次修改操作,每次修改一条边的边权,每次修改后输出有向无环图上路径的值为1的路径数量(对1,000,000,007取模). Inp ...
- HDU--1164
Eddy's research I Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- angular $cookies、$cookieStore
js 文件 加载 <script src="angular-cookies/angular-cookies.js"></script>注入:angular. ...
- 自己实现一个each迭代器
什么是迭代器? 其实就是对一个对象内部进行遍历的方法,比如jquery的each方法,或者原生js的foreach方法. 迭代器的特点 针对迭代器,这里有几个特点: ☑ 访问一个聚合对象的内容而无需暴 ...
- 从零开始学习前端JAVASCRIPT — 1、JavaScript基础
1:定义:javascript是一种弱类型.动态类型.解释型的脚本语言. 弱类型:类型检查不严格,偏向于容忍隐式类型转换. 强类型:类型检查严格,偏向于不容忍隐式类型转换. 动态类型:运行的时候执行类 ...
- PHP move_uploaded_file() 函数
PHP Filesystem 函数 定义和用法 move_uploaded_file() 函数将上传的文件移动到新位置. 若成功,则返回 true,否则返回 false. 语法 move_upload ...
- Html5+js测试题(开发版)
------------------------------------------------ 1. 谈谈你对js闭包的理解: 使用闭包主要是为了设计私有的方法和变量.闭包的优点是可以避免全局变量的 ...
- IOS开发之UIView总结1
太长了,请看 http://blog.csdn.net/xdrt81y/article/details/9128695 performSelector: performSelector:withObj ...
- NPM使用命令总结
NPM使用命令总结 npm是一个node包管理和分发工具,已经成为了非官方的发布node模块(包)的标准.有了npm,可以很快的找到特定服务要使用的包,进行下载.安装以及管理已经安装的包. 1.npm ...