python爬取今日头条关键字图集

1.访问搜索图集结果,获得json如下(右图为data的一条的详细内容).页面以Ajax呈现,每次请求20个图集,其中

title     --- 图集名字

artical_url  --- 图集的地址

count    --- 图集图片数量

  

2. 访问其中的图集

   访问artical_url,获得图集图片详细信息,其中图片url为下载地址

展现出爬虫关键部分,整体项目地址在https://github.com/GeoffreyHub/toutiao_spider

  1 #!/usr/bin/env python
  2 # encoding: utf-8
  3
  4 """
  5 @version: python37
  6 @author: Geoffrey
  7 @file: spider.py
  8 @time: 18-10-24 上午11:15
  9 """
 10 import json
 11 import re
 12 from multiprocessing import Pool
 13 import urllib3
 14 urllib3.disable_warnings()
 15 from requests import RequestException
 16
 17 from common.request_help import make_session
 18 from db.mysql_handle import MysqlHandler
 19 from img_spider.settings import *
 20
 21
 22
 23 class SpiderTouTiao:
 24
 25
 26     def __init__(self, keyword):
 27         self.session = make_session(debug=True)
 28         self.url_index = ‘https://www.toutiao.com/search_content/‘
 29         self.keyword = keyword
 30         self.mysql_handler = MysqlHandler(MYSQL_CONFIG)
 31
 32     def search_index(self, offset):
 33         url = self.url_index
 34         data = {
 35             ‘offset‘: f‘{offset}‘,
 36             ‘format‘: ‘json‘,
 37             ‘keyword‘: self.keyword,
 38             ‘autoload‘: ‘true‘,
 39             ‘count‘: ‘20‘,
 40             ‘cur_tab‘: ‘3‘,
 41             ‘from‘: ‘gallery‘
 42         }
 43
 44         try:
 45             response = self.session.get(url, params=data)
 46             if response.status_code is 200:
 47                 json_data = response.json()
 48                 with open(f‘../json_data/搜索结果-{offset}.json‘, ‘w‘, encoding=‘utf-8‘) as f:
 49                     json.dump(json_data, f, indent=4, ensure_ascii=False)
 50                 return self.get_gallery_url(json_data)
 51         except :
 52             pass
 53             print(‘请求失败‘)
 54
 55     @staticmethod
 56     def get_gallery_url(json_data):
 57         dict_data = json.dumps(json_data)
 58         for info in json_data["data"]:
 59             title = info["title"]
 60             gallery_pic_count = info["gallery_pic_count"]
 61             article_url = info["article_url"]
 62             yield title, gallery_pic_count, article_url
 63
 64     def gallery_list(self, search_data):
 65         gallery_urls = {}
 66         for title, gallery_pic_count, article_url in search_data:
 67             print(title, gallery_pic_count, article_url)
 68             response = self.session.get(article_url)
 69             html = response.text
 70             images_pattern = re.compile(‘gallery: JSON.parse\("(.*?)"\),‘, re.S)
 71             result = re.search(images_pattern, html)
 72
 73             if result:
 74                 # result = result.replace(‘\\‘, ‘‘)
 75                 # result = re.sub(r"\\", ‘‘, result)
 76                 result = eval("‘{}‘".format(result.group(1)))
 77                 result = json.loads(result)
 78                 # picu_urls = zip(result["sub_abstracts"], result["sub_titles"], [url["url"] for url in result["sub_images"]])
 79                 picu_urls = zip(result["sub_abstracts"], [url["url"] for url in result["sub_images"]])
 80                 # print(list(picu_urls))
 81                 gallery_urls[title] = picu_urls
 82             else:
 83                 print(‘解析不到图片url‘)
 84
 85             with open(f‘../json_data/{title}-搜索结果.json‘, ‘w‘, encoding=‘utf-8‘) as f:
 86                 json.dump(result, f, indent=4, ensure_ascii=False)
 87
 88             break
 89
 90         # print(gallery_urls)
 91         return gallery_urls
 92
 93     def get_imgs(self, gallery_urls):
 94         params = []
 95         for title, infos in (gallery_urls.items()):
 96             for index, info  in enumerate(infos):
 97                 abstract, img_url = info
 98                 print(index, abstract)
 99                 response = self.session.get(img_url)
100                 img_content = response.content
101                 params.append([title, abstract, img_content])
102
103                 with open(f‘/home/geoffrey/图片/今日头条/{title}-{index}.jpg‘, ‘wb‘) as f:
104                     f.write(img_content)
105
106                 SQL = ‘insert into img_gallery(title, abstract, imgs) values(%s, %s, %s)‘
107                 self.mysql_handler.insertOne(SQL, [title, abstract, img_content])
108                 self.mysql_handler.end()
109
110         print(f‘保存图集完成‘ + ‘-‘*50 )
111         # SQL = ‘insert into img_gallery(title, abstract, imgs) values(%s, %s, %s)‘
112         # self.mysql_handler.insertMany(SQL, params)
113         # self.mysql_handler.end()
114
115
116 def main(offset):
117     spider = SpiderTouTiao(KEY_WORD)
118     search_data = spider.search_index(offset)
119     gallery_urls = spider.gallery_list(search_data)
120     spider.get_imgs(gallery_urls)
121     spider.mysql_handler.dispose()
122
123
124 if __name__ == ‘__main__‘:
125     groups = [x*20 for x in range(GROUP_START, GROPE_END)]
126
127     pool = Pool(10)
128     pool.map(main, groups)
129
130     # for i in groups:
131     #     main(i)

项目结构如下:

.
├── common
│ ├── __init__.py
│ ├── __pycache__
│ │ ├── __init__.cpython-37.pyc
│ │ └── request_help.cpython-37.pyc
│ ├── request_help.py
├── db
│ ├── __init__.py
│ ├── mysql_handle.py
│ └── __pycache__
│ ├── __init__.cpython-37.pyc
│ └── mysql_handle.cpython-37.pyc
├── img_spider
│ ├── __init__.py
│ ├── __pycache__
│ │ ├── __init__.cpython-37.pyc
│ │ └── settings.cpython-37.pyc
│ ├── settings.py
│ └── spider.py
└── json_data
├── 沐浴三里屯的秋-搜索结果.json
├── 盘点三里屯那些高逼格的苍蝇馆子-搜索结果.json
├── 搜索结果-0.json
├── 搜索结果-20.json
├── 搜索结果-40.json

原文地址:https://www.cnblogs.com/geoffreyone/p/9855602.html

时间: 2024-09-28 07:42:16

python爬取今日头条关键字图集的相关文章

爬取今日头条历史图集将信息保存到MongDB,并且下载图片到本地

写在前面:学习<崔庆才_Python3爬虫入门到精通课程视频>动手写的小项目. (一) 分析页面 访问今日头条页面(https://www.toutiao.com/)在输入框中输入要搜索的关键字,搜索出的页面点击图集.要爬取的就是这里的所有图集. 查看页面的URL可以发现这是一个POST请求,然后我们就检查页面找到POST请求包,进行分析. 这个就是POST请求服务器返回的response 这是一个JSON格式的数据,复制下来放在解析器中查看.(使用jsonView) 可以看到data字段中的

Python爬取今日头条段子

刚入门Python爬虫,试了下爬取今日头条官网中的段子,网址为https://www.toutiao.com/ch/essay_joke/源码比较简陋,如下: 1 import requests 2 import json 3 res = requests.get('https://www.toutiao.com/api/article/feed/?category=essay_joke&utm_source=toutiao&widen=1&\max_behot_time=0&am

Python3爬取今日头条有关《人民的名义》文章

Python3爬取今日头条有关<人民的名义>文章 最近一直在看Python的基础语法知识,五一假期手痒痒想练练,正好<人民的名义>刚结束,于是决定扒一下头条上面的人名的名义文章,试试技术同时可以集中看一下大家的脑洞也是极好的. 首先,我们先打开头条的网页版,在右上角搜索框输入关键词,通过chrome调试工具,我们定位到头条的search栏调用的的API为: http://www.toutiao.com/search_content/?offset=0&format=json

使用python-aiohttp爬取今日头条

http://blog.csdn.net/u011475134/article/details/70198533 原出处 在上一篇文章<使用python-aiohttp爬取网易云音乐>中,我们给自己的微信公众号添加了在线点歌的功能,这次我们再增加一个新闻浏览的功能.由于我平时浏览新闻用的是今日头条,所以在这里就想通过爬取今日头条来获取新闻.不过遗憾的是,这一次我在网上没有找到满意的方法,所以还是自己动手吧. 打开抓包软件Fiddler并设置Filters.  打开今日头条网页,选择热点. ur

Python3从零开始爬取今日头条的新闻【一、开发环境搭建】

Python3从零开始爬取今日头条的新闻[一.开发环境搭建] Python3从零开始爬取今日头条的新闻[二.首页热点新闻抓取] Python3从零开始爬取今日头条的新闻[三.滚动到底自动加载] Python3从零开始爬取今日头条的新闻[四.模拟点击切换tab标签获取内容] Python3从零开始爬取今日头条的新闻[五.解析头条视频真实播放地址并自动下载] 所谓爬虫,就是通过编程的方式自动从网络上获取自己所需的资源,比如文章.图片.音乐.视频等多媒体资源.通过一定的方式获取到html的内容,再通过

使用scrapy爬虫,爬取今日头条首页推荐新闻(scrapy+selenium+PhantomJS)

爬取今日头条https://www.toutiao.com/首页推荐的新闻,打开网址得到如下界面 查看源代码你会发现 全是js代码,说明今日头条的内容是通过js动态生成的. 用火狐浏览器F12查看得知 得到了今日头条的推荐新闻的接口地址:https://www.toutiao.com/api/pc/focus/ 单独访问这个地址得到 此接口得到的数据格式为json数据 我们用scrapy+selenium+PhantomJS的方式获取今日头条推荐的内容 下面是是scrapy中最核心的代码,位于s

用Ajax爬取今日头条图片

Ajax原理 ? 在用requests抓取页面时,得到的结果可能和浏览器中看到的不一样:在浏览器中可以正常显示的页面数据,但用requests得到的结果并没有.这是因为requests获取的都是原始 HTML文档,而浏览器中页面 则是经过Ajax处理数据后生成的.这些数据可能在HTML文档中,也可能是经过JavaScript和特定算法后生成的. ? 刚开始HTML文档中不包含某些数据,当原始页面加载完后,会向服务器发送Ajax请求获取数据,这些数据被JavaScript处理形成一些新页面. ?

用Ajax爬取今日头条图片集

Ajax原理 ? 在用requests抓取页面时,得到的结果可能和浏览器中看到的不一样:在浏览器中可以正常显示的页面数据,但用requests得到的结果并没有.这是因为requests获取的都是原始 HTML文档,而浏览器中页面 则是经过Ajax处理数据后生成的.这些数据可能在HTML文档中,也可能是经过JavaScript和特定算法后生成的. ? 刚开始HTML文档中不包含某些数据,当原始页面加载完后,会向服务器发送Ajax请求获取数据,这些数据被JavaScript处理形成一些新页面. ?

爬取今日头条收藏夹文章列表信息

从了解Python到决定做这个项目,从临近期末考试到放假在家,利用零碎的时间持续了一个月吧.完成这个项目我用了三个阶段 阶段一: 了解Python,开始学习Python的基本语法,观看相关爬虫视频,了解到爬取网页信息的简单措施 阶段二: 开始着手分析头条收藏夹页面. 头条收藏夹地址格式: 地址中有三个变量参数,as,cp,max_repin_time,as,cp在页面内可以找到源码,是基于对当前时间戳加密得到的,max_repin_time是指向下一页面URL的关键值,从页面数据列的最后一项中获