爬虫 1 ---获取今日头条图片

it2022-05-05  348

主要参考崔庆才(狗粮散播达人)的教程完成对浸提头条图片的爬取 [Python3网络爬虫开发实战] 6.4-分析Ajax爬取今日头条街拍美图 因为网站变动,不能完全照搬他的方法,但是思想上基本一致, 是非常好的教材,然后自己做了些改动,可以进行相关的爬取工作。完整的代码见我的github,烦劳各位感觉满意的给个小星星呀,谢谢。 这里的步骤涉及到使用ajax,建议看看相关的信息。这里不做累述

步骤1- – 网页查看

(1)打开今日头条网址
(2)在搜索框输入图片并回车

获得如下页面:

(3)鼠标移动至图片上,点击右键选择–检查,
(4)鼠标移动至图片上,点击右键选择–源代码
(5)发现检查中有相应的地址信息而源代码中没有,刷新页面,下拉滚动轴,网址也是不变,一直如下所示

(6)选择检查—network—XHR ,

如上图如果显示空白信息,则在原来网页中向下滚动,刷新页面,此处出现信息 如上图所示,点击左侧链接, 右侧有headers ,和preview,

(7)点击preview

发现和检查中可以看到的图片的源码信息等,我们要获取的图片的url就在里面

(8)点击headers

可以获取相关的请求信息。后面代码会用到,如下图所示, 这是一个GET请求,请求URL的参数有offset、format、keyword、autoload、count和cur_tab。我们需要找出这些参数的规律,因为这样才可以方便地用程序构造出来 点击左边每个一个链接(每次滚动页面,加载新的内容时,都会出现一个新的链接)右侧最下栏的query string parameters只是改变了offset, 而且第二次请求的offset值为20,第三次为40,第四次为60,所以可以发现规律,这个offset值就是偏移量,进而可以推断出count参数就是一次性获取的数据条数。

步骤2 代码实战

1 加载所有需要的包
import json import os from hashlib import md5 import requests from urllib.parse import urlencode
2 定义headers详细信息
headers = { 'Host': 'www.toutiao.com', 'user-agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36', 'cookie':'td_cookie=2173535685; tt_webid=6714238007476585991; WEATHER_CITY=北京; UM_distinctid=16bfac56be9a80-04ebd50cf5b56-444a002e-1aeaa0-16bfac56bea462; tt_webid=6714238007476585991; csrftoken=ee8f5c41b0aca48a69da37b586554692; s_v_web_id=6fd4c873aad997703e465811e9042198; __tasessionId=ff66dw7xv1563412990903; CNZZDATA1259612802=172832580-1563275139-null|1563410996', 'x-requested-with': 'XMLHttpRequest', 'referer': 'https://www.toutiao.com/search/?keyword=图片'}
3 获取图片真正所在的地址
def get_page(offset): # offset= '20' params = {'aid': '24', 'app_name': 'web_search', 'offset':offset, 'format':'json', '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) # 这个不可以获得所有的数据,但是这是从检查中获得的。增加header时可以 try: res = requests.get(url,headers=headers) if res.status_code==200: return url, res.json() # 注意这里的格式,返回的是json的格式 except requests.ConnectionError: return None
4 获取图片的title和url

这里将获取的信息存入为字典格式的数据

def get_large_img_url(req): k = {} for df in req['data']: if 'title' in df.keys(): title = df['title'] for key in df.keys(): if 'large_image_url' in key: value = df['large_image_url'] if len(value)!=0: k[title] = value return k
5 获取图片信息并保存到本地

图片的名字m

def save_img(img_url): # 定义要保存的地址 path = "F:\\Learn\\python\\pycodes\\zhengt\\10_pa\\L1_basic\\img\\a4_img" for i in img_url: tit = i url = img_url[i] try: # response = requests.get(url, headers=headers) # 这个不可以,返回的是400,,403等 response = requests.get(url) # 不需要放入headers的信息 if response.status_code==200: file_path = '{0}\\{1}.{2}'.format(path,md5(response.content).hexdigest(), 'jpg') if not os.path.exists(file_path): with open(file_path,'wb') as f: f.write(response.content) else: print('已经下载过了',file_path) else: print( response.status_code) except requests.ConnectionError: print('未能保存图片',url)
6 执行代码
group = [i*20 for i in range(1,6)] # 这里可以自己设置,害怕被封号,就设置了少量的内容爬取, for n in group: url,data = get_page(str(n)) # 获取要爬取的网页地址 res = requests.get(url, headers=headers) # 使用request进行数据下载 req = json.loads(res.text) # 数据转为json格式, # print(len(req),'\n', req.keys(),'\n',type(req['data']),'\n',len(req['data']) ) img_url = get_large_img_url(req) # 获取图片的url save_img(img_url)

最后获得的结果,给张截图吧:


最新回复(0)