今日头条抓取页面:

分析街拍页面的 ajax 请求:

通过在 XHR 中查看内容,获取 url 链接,params 参数信息,将两者进行拼接后取得完整 url 地址。data 中的 article_url 为各详情页的链接地址。

代码显示:

 1 # 获取街拍页面;
2 def one_page_index(offset, keyword, headers):
3 params = {
4 'aid': 24,
5 'app_name': 'web_search',
6 'offset': offset,
7 'format': 'json',
8 'keyword': keyword,
9 'autoload': 'true',
10 'count': 20,
11 'en_qc': 1,
12 'cur_tab': 1,
13 'from': 'search_tab',
14 'pd': 'synthesis',
15 }
16 url = "https://www.toutiao.com/api/search/content/?" + urlencode(params)
17 try:
18 response = requests.get(url, headers=headers)
19 if response.status_code == 200:
20 return response.text
21 return None
22 except RequestException:
23 print('请求索引页出错!')
24 return None
1 # 解析街拍页面的信息;
2 def parse_one_page(html):
3 data = json.loads(html)
4 if data and 'data' in data.keys():
5 for item in data.get('data'):
6 yield item.get('article_url')

详情页的解析:

需将获取到的数据进行格式调整;

代码显示:

 1 def parse_detail(html, url):
2 soup = BeautifulSoup(html, 'lxml')
3 title = soup.select('title')[0].get_text()
4 image_pattern = re.compile('gallery: JSON.parse\("(.*)"\)', re.S)
5 result = re.search(image_pattern, html)
6 if result:
7 # group(1)即为第一个括号里面的内容;
8 # 将获取的数据格式进行调整;
9 newResult = result.group(1).replace("\\\\u002F", '\/')
10 newResult = newResult.replace("\\", '')
11 data = json.loads(newResult)
12 if data and 'sub_images' in data.keys():
13 sub_images = data.get('sub_images')
14 images = [item.get('url') for item in sub_images]
15 for image in images: download_image(image)
16 return {
17 "title": title,
18 "url": url,
19 "images": images
20 }

例外:

在街拍主页中,有些网页的内容不是图集,而是在单个页面中显示所有的图片,其解析的内容与图集形式的网页内容不同,无法正常解析出内容,会获取 None 。在写入数据库时需进行判断。

最后将抓取的数据保存到 MongoDB 数据库中,且将图片保存到本地文件中。

完整代码:

1 # config.py 文件
2
3 MONGO_URL = "localhost"
4 MONGO_DB = 'toutiao'
5 MONGO_TABLE = 'toutiao'
6
7 GROUP_START = 1
8 GROUP_END = 20
9 KEYWORLD = '街拍'
  1 import json
2 import os
3 import re
4 from hashlib import md5
5 from urllib.parse import urlencode
6 import pymongo
7 from bs4 import BeautifulSoup
8 from requests.exceptions import RequestException
9 import requests
10 from toutiao.config import *
11 from multiprocessing import Pool
12
13
14 client = pymongo.MongoClient(MONGO_URL)
15 db = client[MONGO_DB]
16
17 # 获取街拍页面;
18 def one_page_index(offset, keyword, headers):
19 params = {
20 'aid': 24,
21 'app_name': 'web_search',
22 'offset': offset,
23 'format': 'json',
24 'keyword': keyword,
25 'autoload': 'true',
26 'count': 20,
27 'en_qc': 1,
28 'cur_tab': 1,
29 'from': 'search_tab',
30 'pd': 'synthesis',
31 }
32 url = "https://www.toutiao.com/api/search/content/?" + urlencode(params)
33 try:
34 response = requests.get(url, headers=headers)
35 if response.status_code == 200:
36 return response.text
37 return None
38 except RequestException:
39 print('请求索引页出错!')
40 return None
41
42
43 # 获取街拍各详情页的信息;
44 def get_detail_page(url, headers):
45 try:
46 response = requests.get(url, headers=headers)
47 if response.status_code == 200:
48 return response.text
49 return None
50 except RequestException:
51 print('请求详情页出错!')
52 return None
53
54
55 # 解析街拍页面的信息;
56 def parse_one_page(html):
57 data = json.loads(html)
58 if data and 'data' in data.keys():
59 for item in data.get('data'):
60 yield item.get('article_url')
61
62
63 # 街拍各详情页的解析;
64 # 使用正则解析数据;
65 def parse_detail(html, url):
66 soup = BeautifulSoup(html, 'lxml')
67 title = soup.select('title')[0].get_text()
68 image_pattern = re.compile('gallery: JSON.parse\("(.*)"\)', re.S)
69 result = re.search(image_pattern, html)
70 if result:
71 # group(1)即为第一个括号里面的内容;
72 # 将获取的数据格式进行调整;
73 newResult = result.group(1).replace("\\\\u002F", '\/')
74 newResult = newResult.replace("\\", '')
75 data = json.loads(newResult)
76 if data and 'sub_images' in data.keys():
77 sub_images = data.get('sub_images')
78 images = [item.get('url') for item in sub_images]
79 for image in images: download_image(image)
80 return {
81 "title": title,
82 "url": url,
83 "images": images
84 }
85
86
87 # 下载图片;
88 def download_image(url):
89 print('正在下载', url)
90 try:
91 response = requests.get(url)
92 if response.status_code == 200:
93 # 返回图片使用content;
94 save_image(response.content)
95 return None
96 return None
97 except RequestException:
98 print('请求图片出错!')
99 return None
100
101
102 # 将图片保存到本地;
103 # 使用md5形式的文件名,内容相同的md5值也相同,防止下载重复的图片;
104 def save_image(content):
105 file_path = '{0}/{1}.{2}'.format(os.getcwd(), md5(content).hexdigest(), 'jpg')
106 if not os.path.exists(file_path):
107 with open(file_path, 'wb') as f:
108 f.write(content)
109 f.close()
110
111
112 # 将数据存储到MongoDB中;
113 # 某些网页的图片全部在单页中显示,代码与图集形式显示的网页不同,解析会匹配不到内容,无法插入数据库;
114 def save_to_mongodb(result):
115 if result and db[MONGO_TABLE].insert(result):
116 print('存储到MongoDB成功', result)
117 return True
118 return False
119
120
121 def main(offset):
122 headers = {
123 "User-Agent": 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36',
124 "cookie": 'tt_webid=6741657574736889357; WEATHER_CITY=%E5%8C%97%E4%BA%AC; tt_webid=6741657574736889357; csrftoken=9e7ac598957d2ec36c80c6f1e05b9622; s_v_web_id=2ab2b8ff35fc91cacdec489ca9a5570f; __tasessionId=d6osr6e6r1569719745562; UM_distinctid=16d7a9f7f4724e-0d4cc2a69d799-3c375d0d-100200-16d7a9f7f4a4f1'
125 }
126 html = one_page_index(offset, KEYWORLD, headers)
127 for url in parse_one_page(html):
128 if url:
129 html = get_detail_page(url, headers)
130 result = parse_detail(html, url)
131 save_to_mongodb(result)
132
133 # 运行;
134 if __name__ == '__main__':
135 groups = [x * 20 for x in range(GROUP_START, GROUP_END + 1)]
136 Pool = Pool()
137 Pool.map(main, groups)

分析 ajax 请求并抓取 “今日头条的街拍图”的更多相关文章

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

    项目说明 本项目以今日头条为例,通过分析Ajax请求来抓取网页数据. 有些网页请求得到的HTML代码里面并没有我们在浏览器中看到的内容.这是因为这些信息是通过Ajax加载并且通过JavaScript渲 ...

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

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

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

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

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

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

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

    import requests from urllib.parse import urlencode # 引入异常类 from requests.exceptions import RequestEx ...

  6. python爬虫知识点总结(十)分析Ajax请求并抓取今日头条街拍美图

    一.流程框架

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

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

  8. 分析AJAX抓取今日头条的街拍美图并把信息存入mongodb中

    今天学习分析ajax 请求,现把学得记录, 把我们在今日头条搜索街拍美图的时候,今日头条会发起ajax请求去请求图片,所以我们在网页源码中不能找到图片的url,但是今日头条网页中有一个json 文件, ...

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

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

随机推荐

  1. mybatis学习日志之总结

    一.介绍mybatis MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名 ...

  2. gdb调试用命令与一般调试方法

    示例代码 1 #include <iostream> 2 using namespace std; 3 4 void Print() 5 { 6 cout<<"hel ...

  3. Spark Core核心----RDD常用算子编程

    1.RDD常用操作2.Transformations算子3.Actions算子4.SparkRDD案例实战 1.Transformations算子(lazy) 含义:create a new data ...

  4. 4、kubernetes基础概念

    一.基础概念 1.Master节点 整个集群的控制中枢.Master节点是Kubernetes集群的控制节点,在生产环境中不建议部署集群核心组件外的任何Pod,公司业务的Pod更是不建议部署到Mast ...

  5. Linux 自旋锁,互斥量(互斥锁),读写锁

    自旋锁(Spin Lock) 自旋锁类似于互斥量,不过自旋锁不是通过休眠阻塞进程,而是在取得锁之前一直处于忙等待的阻塞状态.这个忙等的阻塞状态,也叫做自旋. 自旋锁通常作为底层原语实现其他类型的锁. ...

  6. Longhorn 云原生容器分布式存储 - Python Client

    内容来源于官方 Longhorn 1.1.2 英文技术手册. 系列 Longhorn 是什么? Longhorn 云原生容器分布式存储 - 设计架构和概念 Longhorn 云原生容器分布式存储 - ...

  7. NX二次开发-创建NX9 NXOpenCPP Wizard开发向导模板

    这篇文章,我在CSDN,在唐工论坛都发过.http://www.nxopen.cn/forum.php?mod=viewthread&tid=2039&highlight=NX9 博客 ...

  8. Centos7最小化系统安装_配置

    本文总结了作者使用centos最小化安装时,碰到的问题和解决方案. 网络问题.作者使用虚拟机安装时,网卡并没有激活.操作: 1 cd /etc/sysconfig/network-script 2 v ...

  9. CGLib 简析

    背景 JDK 动态代理存在的一些问题: 调用效率低 JDK 通过反射实现动态代理调用,这意味着低下的调用效率: 每次调用 Method.invoke() 都会检查方法的可见性.校验参数是否匹配,过程涉 ...

  10. vim的配置文件

    网上一个比较常见的配置文件设置如下,这个配置还是很棒的,尤其创建脚本或者c文件时 " All system-wide defaults are set in $VIMRUNTIME/debi ...