Python《爬虫初实践》

今天转转悠悠,突然不知道该学些什么,偶然的一瞬间脑子里想到了爬虫,这个我很早就了解的技术,我却没有亲自实践过,于是这次想好好地去了解下,学习下简单的使用方法,毕竟自以后的深度学习中也是有用处的,爬取图片来做数据源。

一:简单入手
网络的上的图片都有所在服务器URL。
我们首先得获得一个可以发起HTTP请求的办法,我们使用requests包的方法。
做个简单的实验,把www.baidu.com的首页HTML请求下来。

import requests   #导入模块

def run():        #声明一个run方法
    response = requests.get("http://www.baidu.com")
    print(response.text)

if __name__ == "__main__":   #主程序入口
    run()    #调用上面的run方法

发现是可以的。
在这里插入图片描述

然后我们去一个图片网站上去爬取一些图片下来,刚刚我们是爬取HTML,现在我们尝试爬取图片

import requests   #导入模块

def run2():
    response = requests.get("http://wx3.sinaimg.cn/large/0076BSS5ly1gliowcgks1j30u0112wjn.jpg")
    with open("D:/estimages/mn.jpg", "wb") as f :
        f.write(response.content)
        f.close

if __name__ == "__main__":   #主程序入口
    run2()    #调用上面的run方法

图片也是顺利下载了,我们看一看
在这里插入图片描述

二:实战操作
我们今天要爬取的是网站http://jandan.net/ooxx,这里有很多评论内容,每个评论下都是有一张图片的,而且评论内容很多,都有分页了,有分页也不怕,因为分页的内容都是一样的,我们来细看。

网页内容有分页
在这里插入图片描述

检查源码如下:
在这里插入图片描述

也就是如果我们想跳到下一页面,只需要把这个“下一页”的< a>的herf链接值得到,重新使用request请求一下这个链接值就能调到下一页面,循环执行的话,就能不断根据连接进行爬取。

经过观察,每个下一页的< a>标签都属于一个previous-comment-page的calss,这个很重要,能方便BeautifulSoup直接能获取该元素。

每个页面分页栏下面接着就是一个大的评论区,每个评论都是有一张图片,很规律。
在这里插入图片描述

检查源码如下:
在这里插入图片描述

可以看出来这是一个comment列表,每一个comment都有一个ID。
我们需要进去每一个ID去看看图片的位置和内容,如下:
在这里插入图片描述

经过观察,每个图片的src url值和【查看原图】的herf url值是一样的,【查看原图】的< a>值都是属于一个view-img-link的calss,这个很重要,能方便BeautifulSoup直接能获取该元素。

BeautifulSoup是一个方便能直接访问HTML元素的包。
配合上requests就能实现一个简单的图片爬取功能了。

完整源码如下:
直接上代码学习BeautifulSoup和request的用法吧。

import os
import requests
from bs4 import BeautifulSoup

class Config:
    page_num = 3
    save_dir = 'D:\estimages'

opt = Config()

if not os.path.exists(opt.save_dir):
    os.mkdir(opt.save_dir)

# 设置URL的请求头
headers = {'referer': 'http://jandan.net/',
           'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0'}

# 这是一个集合,不能重复,也就是不能重复设置
image_cache = set()
index = len(image_cache)

# 保存图片
def save_all_images(html, idx):
    global index
    for link in html.find_all('a', {'class': 'view_img_link'}):
        href = link.get('href')
        if href not in image_cache:
            print("image: http:" + href)

            with open(
                    '{}/{}'.format(opt.save_dir, href.split("/")[-1]), 'wb') as jpg:  # 请求图片并写进去到本地文件
                jpg.write(requests.get("http:" + href).content)

            image_cache.add(href)
            print("正在抓取第%s条数据" % index)
            index += 1

def findAnotherPage(html):
    ahref = html.find('a', {'class': 'previous-comment-page'})  # 找到导航条的位置,获得下一个连接网页的位置
    if ahref is None:
        print('no more page')
        exit(0)
    else:
        url = "http:" + ahref.get('href')
        print("next page: " + url)
        return url

if __name__ == '__main__':
    url = 'http://jandan.net/ooxx'
    for i in range(0, opt.page_num):
        html = BeautifulSoup(requests.get(url, headers=headers).text, features="html.parser")
        save_all_images(html, i)
        url = findAnotherPage(html)

代码步骤如下:
1:设置必要的参数,比如我们需要爬取几个页面,图片在本地的存储位置。
2:设置一个set集合,图片不能重复,因此每下载一张图片就记录这个图片的url。
3:真正下载的时候,每调到一个页面就把该页面的comment区域的所有图片请求下;来。
4:根据分页栏的下一页面地址,调到新的页面,重复执行第三步骤。

下载的时候我们把原始文件名完整保存了下来,并且把url记录在set,避免重复下载。

效果如下:
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值