本文为项目的练习之一。项目来源网页https://www.cnblogs.com/qun542110741/p/9145286.html,项目要求为爬取今日头条搜索关键词为小姐姐的图片。
首先先分析下网页。

1.分析网页分页规则
下滑页面几次后会发现该页面是会随着你鼠标的滚动而动态加载,不像百度可以点击分页按钮跳转到指定页数。那么就可以确定该页面是使用 json 来传输数据。

在开发者模式下发现每次页面更新,除了加载大量图片文件,还会加载一个?aid前缀的文件。可以看到该文件请求的地址和页面的地址不一样。

复制网址在新页面打开,可以看到里面的标题和搜索结果的标题一致,那么这就是我们要找的源网址。
再回到搜索结果页面,提取多个?aid文件的请求网址,寻找网址分页规律。

我们可以看到每个网址只有2个地方不一样,第一个是一串13位的数字,初步推测是时间戳。第二个是偏移量,从20开始,步长20。
第一个的话,我们先使用 time.time() 获取当前的时间,会发现 time.time()*1000 取整后即为 13 位数字,将源网址的 13 位数字替换为当前的时间,验证确实是 time.time()*1000 取整无疑。
那么分页规律就已得出。
2.爬取内容的定位

打开http://json.cn将源网址的内容复制到左边的输入框进行解析。右边的方框会显示解码后的内容。可以看到所有的内容都在 data 里面。标题和图片地址在各个 object 里的 title 和 image_list 里面。
解析完毕,然后是先爬取一页数据看下,如果成功的话再循环爬取。探索过程就不展示了,直接贴出最后的代码。
最后有3个点要注意下。
- 有的网址是微信公众号或者是视频,那么会获取不到相应的 title或image_list,要使用下 try…except 跳过。
- 文件名的创建不能有空格或者是 \/?:*<>| 等特殊符号,需要使用正则或者是 replace 替换掉。
- image_list 里面的网址是小图,需要将其中部分内容替换为origin来获取大图,详情见代码
import requests
import time
import os
from urllib import request
import re
请求头
headers = {user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36,
referer: https://www.toutiao.com/search/?keyword=%E5%B0%8F%E5%A7%90%E5%A7%90,
cookie: tt_webid=6805093436782708238; WEATHER_CITY=%E5%8C%97%E4%BA%AC; tt_webid=6805093436782708238; csrftoken=9412d118eebe20139b2180cdae95722d; ttcid=c90a8e8626874418add2469184072fe532; RT="z=1&dm=toutiao.com&si=z3bslifp08&ss=k800uaig&sl=9&tt=8xq&obo=5&ld=5qz1g&r=0f8c32692cd648ca8888f3a24ac0cb09&ul=5qz1j&hd=5qz1m"; SLARDAR_WEB_ID=56b7b4f5-3148-4239-bc72-d5f5f6c81e3e; s_v_web_id=verify_k818jznx_vJj3CICd_Vf4r_46br_8Gdr_uVv4NugWPaO3; __tasessionId=ii2wsjlel1584772377896; tt_scid=yCii1T2rQObu5AzeSWNNrDFm6WTNz0WPmTZ2Y69NPUH4h8Whdv6xA7XqozVxxrUAfba1
}
获取时间戳
for i in range(20,101,20):
timestamp = int(time.time()*1000)
url = https://www.toutiao.com/api/search/content/?aid=24&app_name=web_search&offset={j}&format=json&keyword=%E5%B0%8F%E5%A7%90%E5%A7%90&autoload=true&count=20&en_qc=1&cur_tab=1&from=search_tab&pd=synthesis×tamp={k}&_signature=1yhIUgAgEBARf.HfQ988A9cpCUAAIlmWSLvbQsNnt7yIt.AP5xeQpTxPko6nwEQ9h8sOE7IAozHYcml6xPUSLt-1Pb6LULcx.yWCRAHV3n1QCweCpHLMXIxnR-4adJa3njy.format(j=i,k=timestamp)
解码
resp = requests.get(url,headers=headers).json()
datas = resp[data]
print(=*30)
print(下载第%d页%(i/20))
for data in datas:
try:
替换标题中的特殊符号和去掉空格
title = re.sub(r[\\/\:\*?<>\|]*,,data[title]).strip()
except:
continue
创建图片标题名对应的文件夹
dir_path = os.path.join(test,title)
if not os.path.exists(dir_path):
os.mkdir(dir_path)
try:
for i,image in enumerate(data[image_list]):
将图片网址替换为大图网址
url = re.sub(rlist/190x124|list,origin,image[url])
try:
request.urlretrieve(url,os.path.join(dir_path,%d.jpg%(i+1)))
print(title+ 第%d张图片下载成功%(i+1))
except:
print(title+ 第%d张图片下载失败%(i+1))
except:
pass
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。