昨天利用Ajax爬取了微博首页,中间出现好多问题,但最终基本都解决了!有兴趣的可以去看看那篇文章,这篇博客主要讲如何利用requests模拟Ajax爬取今日头条中街拍的内容。
首先打开今日头条,输入街拍,找到我们所要的信息
按照下图的方式寻找模拟Ajax请求所需要的信息
在写代码之前要明确我们的目标是什么------找到Ajax请求后服务器发送回来的json数据,这些数据在网页的network中都能看到:
知道信息和目标之后就可以写代码了
直接上代码,在代码中理解各种参数
import requests
import json
def getHtml(url):
try:
---------------------------请求头信息----------------------------------
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6788.400 QQBrowser/10.3.2864.400",
"X-Requested-With":"XMLHttpRequest",
"Referer":"https://www.toutiao.com/search/?keyword=%E8%A1%97%E6%8B%8D"
}
------------------------get请求所带的参数-------------------------------
params = {
"aid":"24",
"offset":"20",
"format":"json",
"keyword": "街拍",
"autoload": "true",
"count": "20",
"cur_tab": "1",
"from": "search_tab",
"pd": "synthesis",
}
---------------------------获取数据内容--------------------------------
response = requests.get(url,headers = headers,params = params)
response.raise_for_status()
response.encoding = response.apparent_encoding
return response.text
except:
return "爬起失败"
if __name__ == '__main__':
url = "https://www.toutiao.com/api/search/content/?"
page = getHtml(url)
将爬取的内容转化为JSON数据,便于后续的提取小姐姐图片的URL
print(json.loads(page))
结果如下:
最难的时候到了------清洗数据,找到我们所需要的东西
教大家一种方法,也是我无意之间发现的,就是打开我们请求的数据的URL,在网页中查看,条理更加清晰!
在网页中打开:
我们就来具体分析一下data中的数据:
找到我们所需要的内容后,就可以写代码了:
具体的代码如下:
import requests
import json
def getHtml(url):
try:
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6788.400 QQBrowser/10.3.2864.400",
"X-Requested-With":"XMLHttpRequest",
"Referer":"https://www.toutiao.com/search/?keyword=%E8%A1%97%E6%8B%8D"
}
params = {
"aid":"24",
"offset":"0",
"format":"json",
"keyword": "街拍",
"autoload": "true",
"count": "20",
"cur_tab": "1",
"from": "search_tab",
"pd": "synthesis",
}
response = requests.get(url,headers = headers,params = params)
response.raise_for_status()
response.encoding = response.apparent_encoding
return response.text
except:
return "爬取失败"
if __name__ == '__main__':
url = "https://www.toutiao.com/api/search/content/?"
page = getHtml(url)
data_json = json.loads(page)
item = data_json.get("data")
for i in item:
imgs_list = i.get("image_list")
title = i.get("title")
-----data中并不是每一个数据都包含我们所需要的东西,所以加一个条件-------
if not imgs_list:
continue
-------------------------------------------------------------------
print(title)
print(imgs_list)
来看结果:
这只是第一页中所包含的数据,我们只需要给加上一个循环,请求头中offset就是控制页面的,每页20个数据,也就是说0,20,40,60,80......,这样我们就能动态的爬取若干图片了!具体的循环我就不贴出来了,有兴趣的可以自己写一下!
最后,还是那句话,有兴趣的小伙伴可以一起交流!!!