不用python爬今日头条_手把手教你从今日头条爬取你想要的任何图片

都说人生苦短,我用python。为了找点乐趣,不如写个爬虫?

那爬什么呢?

宇宙条是爬虫界行家,它的很多信息都是从其它网站爬来的,那就拿它练练手吧。

网上类似的文章其实不少,但是大多是很久之前的,在这期间头条已经做了改版,因此还必须自己动手。

具体原理不多说了,直接简单介绍下步骤:

1.首先,打开头条首页,搜索关键词「美景」,可以得到搜索结果页面链接为https://www.toutiao.com/search/?keyword=美景​,搜索结果如下:

image

2.同时注意到这是一个Ajax请求,因此我们需要拿到其真实的请求url,就是图中红框标出来的部分。

3.第一次发起搜索请求时,头条有一个滑块验证,这里我们就不模拟这个过程了,手动验证,拿到cookie就好,同时将自己的浏览器信息,请求参数都复制出来:

image

连续向后翻页,发现变化的参数只有offset一个,也就是偏移量。

4.观察请求结果,最关键的是article_url这个字段,根据这个链接重定向,就可以跳转到列表中每篇文章的详情页。

image

5.进入详情页,查看网页源码,可以发现图片链接都是以下图标出来的形式记录的,这就好办了,简单正则匹配一下就好

image

6.拿到图片链接,保存到本地,大功告成。

image

应该说头条相对来说做得比较简单一些,毕竟是新闻类网站,总共差不多100行代码就搞定了,不像淘宝,要爬它的数据就要困难很多。

当然了,除了爬美景,其它照片你想爬啥就怕啥,修改下搜索关键字就好了。第一次写爬虫,还有很多可以优化的地方。简单贴下代码,需要的自取,鬼晓得头条啥时候又改版了,同时欢迎大家review😆。

最后,祝各位大小宝宝节日快乐~~~~

更多技术文章,咱们公众号见,我在公众号里等你~

image.png

# -*- coding: utf-8 -*-

import os

import re

import threading

import time

from hashlib import md5

from urllib import urlencode

import requests

# 这里设置你想查询的关键字

keyword = '美景'

# 这里替换成你自己的浏览器信息

user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'

# 头条图片搜索需要滑动验证,因此简单处理,先手动验证,然后设置cookie

cookie = 'tt_webid=6696746174420534791; WEATHER_CITY=%E5%8C%97%E4%BA%AC; UM_distinctid=16b0805ea6f31d-02830a8210d05a-37627e03-1fa400-16b0805ea705fd; tt_webid=6696746174420534791; __tasessionId=znvodagrm1559207733945; csrftoken=7201998104473d4e2ad8302bb74ae401; s_v_web_id=600eabfd649cb7a70f3d80b981411bfc; CNZZDATA1259612802=1444442826-1559202415-%7C1559207815'

headers = {

'Host': 'www.toutiao.com',

'Referer': 'https://www.toutiao.com/search/?keyword=' + keyword,

'User-Agent': user_agent,

'X-Requested-With': 'XMLHttpRequest',

'Cookie': cookie

}

start_offset = 0

end_offset = 20

step = 20

# 根据偏移量获取每页文章列表

def get_page_by_offset(offset):

params = {

'aid': '24',

'app_name': 'web_search',

'offset': offset,

'format': 'json',

'keyword': keyword,

'autoload': 'true',

'count': '20',

'en_qc': '1',

'cur_tab': '1',

'from': 'search_tab',

'pd': 'synthesis',

}

url = 'https://www.toutiao.com/api/search/content/?' + urlencode(params)

try:

resp = requests.get(url, headers=headers)

if resp.status_code == 200:

return resp.json()

except requests.ConnectionError:

return None

# 获取每篇文章的重定向链接

def get_article_url(article):

if article.get('data'):

for item in article.get('data'):

article_url = item.get('article_url')

title = item.get('title')

yield {

'article_url': article_url,

'title': title

}

# 将图片保存到文件

def save2file(title, url):

if not os.path.exists(title):

os.mkdir(title)

resp = requests.get(url)

file_name = './' + title + '/' + md5(resp.content).hexdigest() + '.jpg'

if not os.path.exists(file_name):

with open(file_name, 'wb') as f:

f.write(resp.content)

else:

print('Already Downloaded', file_name)

# 获取每篇文章的图片列表

def get_image_by_article(article):

article_url = article.get('article_url')

title = article.get('title')

print title

print article_url

if article_url:

try:

# 这里需要使用session的方式,否则会因为重定向次数太多而报错

session = requests.Session()

session.headers['User-Agent'] = headers['User-Agent']

resp = session.get(article_url)

if resp.status_code == 200:

# soup = BeautifulSoup(resp.text, 'lxml')

# result = soup.find_all(name='script')[6]

regex = '.*?img src="(.*?)".*?'

items = re.findall(regex, resp.text, re.S)

if items:

for item in items:

print item

save2file(title, item)

except requests.ConnectionError:

print 'Get image fail.'

if __name__ == '__main__':

for offset in range(start_offset, end_offset, step):

article_list = get_page_by_offset(offset)

for article in get_article_url(article_list):

# 每篇文章单独起一个线程进行抓取

t = threading.Thread(target=get_image_by_article(article))

t.start()

t.join()

# get_image_by_article(article)

end_time = time.time()

print('=====Done=====')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/521953.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kubernetes之路 3 - 解决服务依赖

摘要: 在容器服务的客户群中,一个经常被问起的问题就是如何处理服务间依赖。本文介绍了常见的解决方法来实现服务的依赖检查,还进一步用示例展示了如何利用init container, liveness/readiness探针等技术实现服务健康检查&#xf…

java并发访问_Java并发访问

1 线程安全线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。 线程不安全就是不提供数据…

3行代码实现ftp 上传、下载、删除操作集合

为了帮助小伙伴们便捷操作ftp,现对常用的上传、下载、删除功能进行封装,小伙伴只需要传入需要的参数操作即可!告诉小伙伴好消息,本项目我已开源,大家可以根据需要克隆run起来!!! 文章…

Logtail从入门到精通(一):日志采集杂谈

摘要: 目前logtail已承载阿里云全站、所有云产品服务、全球各Region部署、阿里巴巴集团(淘宝、天猫、菜鸟等)上重要服务的数据采集。每天采集接近百万服务器上数PB的实时数据,对接数千个应用与消费者。什么是日志提到日志&#xf…

互联网大佬马老师于昨日教师节正式卸任,让位现任CEO张勇;华为发布新一代CloudLink视讯解决方案,普惠4K+AI;联通……...

关注并标星星CSDN云计算极客头条:速递、最新、绝对有料。这里有企业新动、这里有业界要闻,打起十二分精神,紧跟fashion你可以的!每周三次,打卡即read更快、更全了解泛云圈精彩newsgo go go OPPO Reno2正式发布&#xf…

python输出不重复的单词_Python情感分析(比较单词时,不计算文本中重复的单词)...

您可以使用嵌套的for loop来实现这一点,但是这并不是解决简单问题的好方法:for posWord in posWords:for test in readFile:if i test:counter 1print iprint(counter)这并不是分析情绪的有效方法,相反,你只是在检查文本中是否存…

Logtail从入门到精通(二):开启日志采集之旅

摘要: 为了更好的了解日志采集,这里我们首先对日志采集中遇到的基本概念进行简要的介绍。Logtail相关概念为了更好的了解日志采集,这里我们首先对日志采集中遇到的基本概念进行简要的介绍。概念介绍项目: 项目(Project…

java数组下标越界_在java中,解决数组下标越界的问题

//获取文本内容publicstaticListgetText(StringfilePath){ListsimplesnewArrayList();try{FileReaderreadernewFileReader(filePath);BufferedReaderbfRead...// 获取文本内容public static List getText(String filePath) {List simples new ArrayList();try {FileReader read…

vsftpd常用操作

适用于Centos7.x 作用命令启动systemctl start vsftpd.service关闭systemctl stop vsftpd.service重启systemctl restart vsftpd.service查看运行状态systemctl status vsftpd.service设置开机启动systemctl enable vsftpd.service在线安装yum install -y vsftpd源码安装rpm -…

关于SDN的未来,Linux基金会专访阿里云网络大神

摘要: 近日,大家熟知的国际开源组织Linux基金会与阿里云进行了一次访谈。专访了阿里云网络团队掌门人江鹤。江鹤执掌阿里云网络产品线,并负责阿里集团网络虚拟化产品的研发管理工作。在软件定义网络(SDN)和网络功能虚拟…

5G 共建共享,究竟会带来什么影响?

戳蓝字“CSDN云计算”关注我们哦!共建共享真的来了。根据9月9日中国联通发布的公告,中国联通和中国电信正式签署了《5G网络共建共享框架合作协议书》,将在全国范围内合作共建一张5G接入网络。图片来源网络小枣君认为,这一事件对于…

java 纳秒 毫秒_golang的time包:秒、毫秒、纳秒时间戳输出方式

菜鸟的时候只知道时间戳有10位、13位、还有好长位数的。入坑久了才明白10位数的时间戳是以 秒 为单位;13位数的时间戳是以 毫秒 为单位;19位数的时间戳是以 纳秒 为单位;golang中可以这样写:package mainimport ("time"…

object转float_人工智能-Object Detection API 模型转tflite并验证

最近在用TensorFlow Object Detection API训练目标检测模型,训练好的pb模型大小17.6M,用pb预测效果不错,于是想着如何在手机端运行,查看官网关于tflite的转换,网址:https://github.com/tensorflow/models/b…

Multi Task Learning在工业界如何更胜一筹

摘要: 本文主要介绍多任务学习和单任务学习的对比优势以及在工业界的一些使用。如何从单任务学习转变为多任务学习?怎样使AUC和预估的准确率达到最佳?如何对实时性要求较高的在线应用更加友好?本文将以淘宝实例为大家进行分享多任…

rsync一行代码实现远程文件同步之修改默认22端口

由于需求需要把应用服务器上的日志文件同步到文件服务器上,但是又不能用22端口 文章目录一、应用服务器脚本修改如下二、文件服务器操作三、执行脚本测试四、应用服务器生成ssh key五、文件服务器添加key5.1. 打开.ssh文件夹目录:5.2. 创建authorized_ke…

上云难?TA霸气回应:不要你觉得,一键上云 so easy!

戳蓝字“CSDN云计算”关注我们哦!图片来源网络2019年阿里提出的“All in Cloud”战略以及《全球云计算 IT 基础设施市场预测报告》的数据结果,都在表明企业上云已成不可逆之势;但上云事故接二连三发生似乎又在宣示企业上云之路道阻且长&#…

基于阿里云HiTSDB搭建工业物联网平台实践

摘要: 基于阿里云全面的物联网、云计算与大数据技术搭建云端的企业能源管理物联网平台实现能耗数据采集、统计分析、平衡调度、节能优化等全面的能源管控协同平台。是企业生产运行保障的利器,也是大量企业实现云上管理的实践案例。背景工业企业的能耗占了…

java对象深克隆_JAVA中对象的克隆及深拷贝和浅拷贝

使用场景:在日常的编程过程 中,经常会遇到,有一个对象OA,在某一时间点OA中已经包含了一些有效值 ,此时可能会需一个和OA完全相对的新对象OB,并且要在后面的操作中对OB的任何改动都不会影响到OA的值&#xf…

python安装pyserial模块_Python使用模块Pyserial模块报

用pip安装pyserial后:sudo -H pip install pyserial,运行新建的程序,名称为serial.py,程序中用到:import serial.toos.list_ports,但总是提示ImportError:No module named tools.list_ports,在度娘一顿乱搜后,在stack…

阿里巴巴开源的通用缓存访问框架JetCache介绍

摘要: JetCache是由阿里巴巴开源的通用缓存访问框架,如果你对Spring Cache很熟悉的话,请一定花一点时间了解一下JetCache,它更好用。JetCache可以做类似Spring Cache的注解式缓存,支持TTL、多级缓存、分布式自动刷新&a…