编写程序:
获得json文件:
首先请求最开始的页面: https://www.toutiao.com/search/?keyword=%E7%BE%8E%E5%A5%B3
但是我们不能这样直接把页面交给requests库直接干,因为这是一个ajax接口,如果不加入参数,很可能让你输入什么验证码还是拉动验证条什么,反正就是很麻烦,那我们就加入参数,具体措施如下:
def get_page(offset): # offset偏移,因为每个ajax都是加载固定的页面数
# 这里是20,在第三点图上可以看得到
global headers # 全局变量 我后面还要用
headers = {
'cookie': 'tt_webid=6821518909792273933; WEATHER_CITY=%E5%8C%97%E4%BA%AC; SLARDAR_WEB_ID=b4a776dd-f454-43c6-81cd-bd37cb5fd0ec; tt_webid=6821518909792273933; csrftoken=4a2a6afcc9de4484af87a2ff8cba0638; ttcid=8732e6def0484fae975c136222a44f4932; s_v_web_id=verify_k9o5qf2w_T0dyn2r8_X6CE_4egN_9OwH_CCxYltDKYSQj; __tasessionId=oxyt6axwv1588341559186; tt_scid=VF6tWUudJvebIzhQ.fYRgRk.JHpeP88S02weA943O6b6-7o36CstImgKj1M3tT3mab1b',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36 Edg/81.0.416.68',
'referer': 'https://www.toutiao.com/search/?keyword=%E7%BE%8E%E5%A5%B3',
'x-requested-with': 'XMLHttpRequest'
} # 头信息 加入参数
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',
'timestamp': int(time.time())
url = 'https://www.toutiao.com/api/search/content/?' + urlencode(params) # 构造url, 使用到了urlencode() 函数
} function(){ // 外汇术语 https://www.gendan5.com/terminology.html
url = url.replace('=+', '=') # 这里必须注意现在的网址根本不一样
# print(url)
try:
r = requests.get(url, headers=headers, params=params)
r.content.decode('utf-8')
if r.status_code == 200:
return r.json() # 返回json格式 因为全是字典类型
except requests.ConnectionError as e:
print(e)
这里必须注意一点,请求的网址已经改掉了,我在代码里面给了解释,仔细看看。
获得标题和网址:
def get_image(json): # 获取图片
if json.get('data'): # 如果这个存在
for item in json.get('data'):
if item.get('title') is None:
continue # 如果标题是空值
title = item.get('title') # 获取标题
if item.get('article_url') == None:
continue
url_page = item.get('article_url')
# print(url_page)
rr = requests.get(url_page, headers=headers)
if rr.status_code == 200:
pat = '' # 用正则大致匹配一下范围
match = re.search(pat, rr.text, re.S)
if match != None:
result = re.findall(r'img src=\\"(.*?)\\"', match.group(), re.S)
# print(i.encode('utf-8').decode('unicode_escape')
# 转换编码方式 把\u之类的改掉
yield {
'title': title,
'image': result
}
这里获取的网页链接都是Unicode格式的,在后面的下载部分,我给了修改方案,这也是一个暗坑。
下载图片:
def save_image(content):
path = 'D://今日头条美女//' # 目录
if not os.path.exists(path): # 创建目录
os.mkdir(path)
os.chdir(path)
else:
os.chdir(path)
# ------------------------------------------
if not os.path.exists(content['title']): # 创建单个文件夹
if '\t' in content['title']: # 以title为标题创建单个文件夹
title = content['title'].replace('\t', '') # 去除特殊符号 不然创建不了文件名称
os.mkdir(title + '//')
os.chdir(title + '//')
print(title)
else:
title = content['title']
os.mkdir(title + '//') # 创建文件夹
os.chdir(title + '//')
print(title)
else: # 如果存在
if '\t' in content['title']: # 以title为标题创建单个文件夹
title = content['title'].replace('\t', '') # 去除特殊符号 不然创建不了文件名称
os.chdir(title + '//')
print(title)
else:
title = content['title']
os.chdir(title + '//')
print(title)
for q, u in enumerate(content['image']): # 遍历图片地址列表
u = u.encode('utf-8').decode('unicode_escape')
# 先编码在解码 获得需要的网址链接
# 开始下载
r = requests.get(u, headers=headers)
if r.status_code == 200:
# file_path = r'{0}/{1}.{2}'.format('美女', q, 'jpg') # 文件的名字和地址,用三目运算符来调试文件夹的名字
# hexdisgest() 返回十六进制图片
with open(str(q) + '.jpg', 'wb') as fw:
fw.write(r.content)
print(f'该系列----->下载{q}张')
在U变量的时候进行了编码在解码操作,然后网址就正常很多了。