前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Ajax爬取今日头条街拍美图

Ajax爬取今日头条街拍美图

作者头像
小F
发布2020-10-09 14:53:57
3680
发布2020-10-09 14:53:57
举报

Ajax,全称为Asynchronous Javascript And XML,即异步的JavaScript and XML。它不是一门编程语言,而是利用JavaScript在保证页面不被刷新、页面链接不改变的情况下与服务器交换数据并更新部分网页的技术。常见的比如QQ空间动态中的下滑查看更多的选项。

对于本次的Ajax数据爬取,爬取的是今日头条中的街拍美图(绝对福利(凭实力××)...),详细浏览器信息如下:

获取文章链接相关代码:

代码语言:javascript
复制
import requests
import json
import re

headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
}

def get_first_data(offset):
    params = {
        'offset': offset,
        'format': 'json',
        'keyword': '街拍',
        'autoload': 'true',
        'count': '20',
        'cur_tab': '1',
        'from':'search_tab'
    }
    response = requests.get(url='https://www.toutiao.com/search_content/', headers=headers, params=params)
    try:
        response.raise_for_status()
        return response.text
    except Exception as exc:
        print("获取失败")
        return None

def handle_first_data(html):
    data = json.loads(html)
    if data and "data" in data.keys():
        for item in data.get("data"):
            yield item.get("article_url")

这里需要提一下requests模块的报错,在response对象上调用 raise_for_status()方法,如果下载文件出错,会抛出异常,需要使用 try 和 except 语句将代码行包裹起来,处理这一错误,不让程序崩溃。

另外附上requests模块技术文档网址:http://cn.python-requests.org/zh_CN/latest/

获取图片链接相关代码:

代码语言:javascript
复制
def get_second_data(url):
    if url:
        try:
            reponse = requests.get(url, headers=headers)
            reponse.raise_for_status()
            return reponse.text
        except Exception as exc:
            print("进入链接发生错误")
            return None

def handle_second_data(html):
    if html:
        pattern = re.compile(r'gallery: JSON.parse\((.*?)\),', re.S)
        result = re.search(pattern, html)
        if result:
            imageurl = []
            data = json.loads(json.loads(result.group(1)))
            if data and "sub_images" in data.keys():
                sub_images = data.get("sub_images")
                images = [item.get('url') for item in sub_images]
                for image in images:
                    imageurl.append(images)
                return imageurl
        else:
            print("have no result")

获取图片相关代码:

代码语言:javascript
复制
def download_image(imageUrl):
    for url in imageUrl:
        try:
            image = requests.get(url).content
        except:
            pass
        with open("images"+str(url[-10:])+".jpg", "wb") as ob:
            ob.write(image)
            ob.close()
            print(url[-10:] + "下载成功!" + url)

def main():
    html = get_first_data(0)
    for url in handle_first_data(html):
        html = get_second_data(url)
        if html:
            result = handle_second_data(html)
            if result:
                try:
                    download_image(result)
                except KeyError:
                    print("{0}存在问题,略过".format(result))
                    continue

if __name__ == '__main__':
    main()

最后下载成功:

啦啦啦,具体详情来了:

总的来说,感觉难点就在处理程序异常这一块,感觉到处都在避免异常出现,这也许就是基本功不扎实的缘故吧,另外还是不太能理解生成器的原理,还是需要多看看书。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-08-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 法纳斯特 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档