今天学习分析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中的更多相关文章

  1. 分析 ajax 请求并抓取 “今日头条的街拍图”

    今日头条抓取页面: 分析街拍页面的 ajax 请求: 通过在 XHR 中查看内容,获取 url 链接,params 参数信息,将两者进行拼接后取得完整 url 地址.data 中的 article_u ...

  2. 分析Ajax抓取今日头条街拍美图

    spider.py # -*- coding:utf-8 -*- from urllib import urlencode import requests from requests.exceptio ...

  3. 关于爬虫的日常复习(9)—— 实战:分析Ajax抓取今日头条接拍美图

  4. python爬虫—— 抓取今日头条的街拍的妹子图

    AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. 近期在学习获取j ...

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

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

  6. 爬虫—分析Ajax爬取今日头条图片

    以今日头条为例分析Ajax请求抓取网页数据.本次抓取今日头条的街拍关键字对应的图片,并保存到本地 一,分析 打开今日头条主页,在搜索框中输入街拍二字,打开开发者工具,发现浏览器显示的数据不在其源码里面 ...

  7. 分析Ajax爬取今日头条街拍美图-崔庆才思路

    站点分析 源码及遇到的问题 代码结构 方法定义 需要的常量 关于在代码中遇到的问题 01. 数据库连接 02.今日头条的反爬虫机制 03. json解码遇到的问题 04. 关于response.tex ...

  8. python多线程爬取-今日头条的街拍数据(附源码加思路注释)

    这里用的是json+re+requests+beautifulsoup+多线程 1 import json import re from multiprocessing.pool import Poo ...

  9. python抓取伯乐在线的全部文章,对标题分词后存入mongodb中

    依赖包: 1.pymongo 2.jieba # -*- coding: utf-8 -*- """ @author: jiangfuqiang "" ...

随机推荐

  1. asp.net core 配置

    ASP.NET Core的配置系统已经和之前版本的ASP.NET有所不同了,之前是依赖于System.Configuration和XML配置文件web.config,现在支持各种格式的配置,比以前灵活 ...

  2. ACM_高次同余方程

    /*poj 3243 *解决高次同余方程的应用,已知 X^Y = K mod Z, 及X,Z,K的值,求 Y 的值 */ #include<cstdio> #include<cstr ...

  3. Windows下MYSQL读取文件为NULL

    只记录解决问题的方法. mysql 版本: 5.7.18 问题: 在执行mysql 函数load_file时,该函数将加载指定文件的内容,存储至相应字段.如: SELECT LOAD_FILE(&qu ...

  4. JAVA爬虫实践(实践一:知乎)

    爬虫顺序 1.分析网站网络请求 通过浏览器F12开发者工具查看网站的内容获取方式. 2.模拟HTTP请求,获取网页内容. 可以采用HttpClient,利用JAVA HttpClient工具可以模拟H ...

  5. callback和spring的MD5加密

    举个例子:当我们访问淘宝网站的时候,当点击购物车的时候,这个时候提示用户登录用户名和密码,登录成功后,会返回到购物车的页面.这就是回调. 它不返回淘宝的首页,而是返回到我们点击的内容所在页面. 在写接 ...

  6. block的修饰词为什么选用copy

    想必很多开发人员知道一般用copy修饰block,接下来就讲解为什么需要用copy,甚至会讲到其实用strong修饰block也是可以的 在 Objective-C 语言中,一共有 3 种类型的 bl ...

  7. 一篇文章让你深透理解cookie和session,附带分布式WEB系统redis共享session方案

    cookie和session有什么区别?这是一个很基础的知识点,大家可能都知道一个大概:cookie是存在客户端的,session是存储在服务端,cookie和session用来验证识别用户的登录状态 ...

  8. 关于OELD屏显示电池电量的简易方法

    如何采集电源电压大家可能都熟悉,stm32的ADC+DMA能很方便迅速的帮我们采集到自己想要的电压数据.使用DMA进行数据搬运也能很好的减轻CPU的一部分压力.但是这样只是第一步--数据. 用户想看到 ...

  9. php网站在服务器上邮件发送不了,在本地可以

    标签: php邮箱 2015-11-27 13:58 879人阅读 评论(0) 收藏 举报 分类: php(2) 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近在做phpmailer发送邮 ...

  10. PhpStorm中报 “Cannot run program git.exe, 系统找不到指定的文件” 

    http://blog.csdn.net/lamp_yang_3533/article/details/52003021 在使用PhpStorm的GitHub或Git功能时,经常会出现以下错误信息: ...