zoukankan      html  css  js  c++  java
  • 爬虫入门-使用python写简单爬虫

    从第一章到上一章为止,基本把python所有的基础点都已经包括了,我们有控制逻辑的关键字,有内置数据结构,有用于工程需要的函数和模块,又有了标准库和第三方库,可以写正规的程序了。

    python可以做非常多的事情,最火爆的事情应该是大家一直都在讨论的爬虫,这里编写一个简单的爬虫例子,它能够真正的运行,但主要的目的是在提高对之前知识点的理解和熟悉python如何编写简单工程。

    编写一个爬虫,爬取www.duitang.com网站的数据,主要的功能是通过搜索词得到搜索结果,并分析网页得到商品图片的链接地址并下载图片。

    程序的各个模块功能

    爬虫的一个重要的模块是根据url获取网页数据,我们利用前面一章介绍的第三方库requests,用简单的几行代码来抓取网页数据,可以熟悉函数的写法和逻辑控制。

    def get_http_content(url):
    
        s = requests.Session()
    
        request = s.get(url, headers = headers,timeout=120, verify=False)
        body = ''
        if request.status_code == 200:
            body = request.text
        return body
    

    下载图片的功能如下:

    def get_image( url, name):
        image_path = os.path.join('images/', name)
        if not os.path.exists(image_path):
            r = requests.get(url, stream=True, headers=headers)
            if r.status_code == 200:
                with open(image_path, 'wb') as f:
                    for chunk in r:
                        f.write(chunk)
            else:
                print('==> get image error: ', url)
    

    get_image有两个参数,一个是图片的url地址,一个是图片的名称,为了不想有太多的参数,图片存放的地址在程序中写的是当前路径下的images/目录。

    程序的逻辑控制

    这里我们会详细的解释如何对网站进行分析,如何抽取出我们最想要的数据来满足我们的需求。先用浏览器打开链接 https://www.duitang.com/search/?kw=%E4%B8%AD%E7%A7%8B%E8%8A%82&type=feed&from=tuijian 我们搜索的是中秋节这个关键字,如下:

    查看网页的源代码,也就是我们通过get_http_content 能够得到的数据,一般来说可以利用Beautiful Soup对数据进行处理,并取出关键的字段。但duitang的搜索比较特殊,通过它分页的数据可以看出是动态加载网页内容,查看网络请求,看看是哪一个网络接口。

    通过网络请求的数据,查到了搜索的分页数据,接口在

    https://www.duitang.com/napi/blog/list/by_search/?kw=%E4%B8%AD%E7%A7%8B%E8%8A%82&type=feed&_type=&start=0
    

    分析里面的接口参数,start为分页参数,要取得所有的分页数据只需要改变这个参数。

    如,第二页数据在:

    https://www.duitang.com/napi/blog/list/by_search/?kw=%E4%B8%AD%E7%A7%8B%E8%8A%82&type=feed&_type=&start=24
    

    可以使用for循环,取前十页的数据:

    url_start = 'https://www.duitang.com/napi/blog/list/by_search/?kw=%E4%B8%AD%E7%A7%8B%E8%8A%82&type=feed&_type=&start='
    for i in range(0,10):
    	url = url_start + str(i*24)
    

    整个流程如下:

    if __name__ == '__main__':
    
        # 接口地址
        url_start = 'https://www.duitang.com/napi/blog/list/by_search/?kw=%E4%B8%AD%E7%A7%8B%E8%8A%82&type=feed&_type=&start='
        next_start = 0
        while True:
            #获取api接口数据
            url = url_start + str(next_start)
            content = get_http_content(url)
            json_data = json.loads(content)
    
            # 分析得出图片地址,并下载
            for object_list in json_data['data']['object_list']:
                image_path = object_list['photo']['path']
                image_name = os.path.basename(image_path)
                get_image(image_path,image_name)
    
            #下一页
            next_start = json_data['data']['next_start']
    
            # 分页结束
            if next_start == 0:
                break
    

    程序通过不断的取得分页的数据,用json模块解析数据,提出图片的地址,并下载图片。在images/ 目录下存放着下载的图片文件。

    总结

    一个简单的对网页进行爬取,并根据自己的需求提取网页中所需要的字段,并对字段进行处理,这里仅仅是对图片进行了下载,你还可以对需求进一步的进行扩展,比如把特殊的字段存到数据库中,搜索更多的热词等,进行更多的尝试。

    更多教程:阿猫学编程

  • 相关阅读:
    洛谷 3393 逃离僵尸岛
    洛谷 3275 [SCOI2011]糖果
    SP1437 Longest path in a tree(树的直径)
    洛谷2483 k短路([SDOI2010]魔法猪学院)
    洛谷3243 [HNOI2015]菜肴制作
    洛谷 4568 [JLOI2011] 飞行路线
    [USACO08DEC]在农场万圣节Trick or Treat on the Farm
    手机端table表格bug
    手机端左右滑动效果
    去掉手机端延迟300ms
  • 原文地址:https://www.cnblogs.com/bugingcode/p/8295415.html
Copyright © 2011-2022 走看看