下图是街拍美图保存到本地的电脑截图。
下图是程序运行时的截图。
首先,打开头条的街拍页面,我在不断的往下滑动,页面一直有新的标签刷出来,不过页面的 url 斌并没有变化,所以我猜测这是通过ajax加载的。如下图所示。
上面,我画了三个圈,分别表示三种类型。第一种是点进去之后,必须得通过点击才能看到下一张图片;第二钟是点进去之后,直接往下滑动就可以看到全部的图片,第三种是视频,不在本篇博文的讨论范围。第一和第二种类型都是通过JavaScript加载的页面。
通过查看多个ajxa请求之后,发现只有offset是变化的,并且变化规律很明显。还有,keyword参数其实就是搜索的关键字。
def get_index_page(offset, keyword):
params = {
'offset': offset,
'format': 'json',
'keyword': keyword,
'autoload': 'true',
'count': '20',
'cur_tab': '1',
'from': 'search_tab',
'pd': 'synthesis'
}
base_url = 'https://www.toutiao.com/api/search/content/?'
url = base_url + urlencode(params)
try:
response = requests.get(url=url, headers=headers)
if response.status_code == codes.ok:
print(url + ':导航页请求成功!')
return response.text
except requests.ConnectionError:
print('请求导航页失败!')
return None
我把参数放在一个字典中,然后用urlencode函数封装属性。然后,拼接两个字符串。
分析ajax请求的返回结果,拿到详情页的url。在这里,我发现每个data里面的第一项里面都含有key为cell_type的键值对,而且这个选项没有url,所以这里有两行去除的语句。函数返回的是详情页的url列表。
def parse_index_page(html):
data = json.loads(html)
if data and 'data' in data.keys():
for item in data.get('data'):
if item.get('cell_type') is not None:
continue
yield item.get('article_url')
根据URL的链接,逐个请求详情页,并返回详情页的内容。
def get_detail_page(url):
try:
response = requests.get(url=url, headers=headers)
if response.status_code == 200:
print(url + ':详情页请求成功!')
return response.text
else:
return None
except RequestException:
print('请求详情页错误', url)
return None
通过查看详情页返回的内容可以发现,详情页都是通过JavaScrip