爬取今日头条图片

来源:互联网 发布:a byte of python csdn 编辑:程序博客网 时间:2024/04/29 12:24

1、点击今日头条,在右侧搜索框内输入街拍。这时我们可以看到许多带有图片的文章。当我们滑动到页面底部时,网页会通过ajax加载更多文章。

2、打开浏览器F12的开发者工具,点击Network(chrome下)选项,尝试加载更多文章,可以看到如下http请求:
这里写图片描述

这里写图片描述

我们可以看到,当我们下拉网页加载更多文章时,网页里发出请求如图二。
可以看到请求的URL为:http://www.toutiao.com/search_content/ ,其后面的请求参数:offset代表偏移量,即已经请求的文章数;format表示返回的是json格式的数据;keyword是搜索的关键字;autoload自动加载的标志;count为请求的文章数;cur_tab=1表示网页右侧滑动。

3、我们看看上面这个网页返回什么样的数据:

import jsonfrom pprint import pprintfrom urllib import requesturl = 'http://www.toutiao.com/search_content/?offset=20&format=json&keyword=%E8%A1%97%E6%8B%8D&autoload=true&count=20&cur_tab=1'with request.urlopen(url) as res:#通过request.urlopen向url发出请求,返回数据保存在res    d = json.loads(res.read().decode())#通过read返回内容为bytes 用decode转码为utf-8    pprint(d)#数据为json,用json.load转为python下字典,pprint格式化输出,更易阅读

这里写图片描述

在这个字典里data键对,他里面包含了多有文章的数据列表,将data打印出来:

d = d.get(‘data’)
pprint(d)

可以看到一个由字典组成的列表,列表每一项代表一个文章,包含了文章全部数据,例如标题,url等.我们通过如下方式提取我们请求的文章url列表:

urls = [article.get('article_url') for article in d if article.get('article_url')]#使用列表推导式,循环文章列表,通过get获取url,if条件句排除空的文章.

4.我们将不断请求这些文章的url,读取内容,把图片保存到我们的硬盘,先处理一篇文章,随便点开一个文章链接.http://www.toutiao.com/a6376199901335961857/
按f12查看源代码,可以看到文章主体部分在id=’article_main’的div标签里.h1表示文章标题.

 url = 'http://www.toutiao.com/a6376199901335961857/ 'with request.urlopen(url) as res:    soup = BeautifulSoup(res.read().decode(errors='ignore'),'html.parser')    article_main = soup.find('div', id ='article-main')    photo_list = [photo.get('src') for photo in article_main.find_all('img') if photo.get('src')]    pprint(photo_list)

这样我们就把图片的地址下载了下来.
但是有个问题,当我们访问某些网页的时候,里面的图片是左右滑动出现的,我们无法找到id=article-main的标签.
需要使用javascript相关的工具.

0 0
原创粉丝点击