使用BeautifulSoup爬虫

爬虫刚入门,用BeautifulSoup来练手。

本篇文章前提是安装好了BeautifulSoup、requests模块,还需要内置的os模块。

爬取的网址为:http://www.itcast.cn/channel/teacher.shtml#ajavaee

 

  1. 首先,载入模块
    import requests
    from bs4 import BeautifulSoup
    import os
  2. 然后就是基本的爬取操作:

    ul = 'http://www.itcast.cn/channel/teacher.shtml#ajavaee'
    html = requests.get(ul).text
    main_url = 'http://www.itcast.cn'
    # print(html)
    soup = BeautifulSoup(html, 'lxml')
    img_ul = soup.find_all('div', {'class': 'li_img'})

    这里要注意一点,得到的img_ul类型是ResultSet,意思是标签,并不是正儿八经的字符串。有兴趣的朋友可以print一下或者debug看看结果。

    需要 注意的是,因为分析网页的时候发现,图片网址和当前网页的网址不完全相同,故增加了一个main_url,以备下面的读取图片网址用。

  3. 此时,网页已经变成了一碗美味的“汤汁”。右键图片审查元素可得到图片的对应的代码:

    审查网页
  4. 可以看到图片的网页并不是设置的“ul”,正好解释了第二步。接着创建一个文件夹准备“收货”。

    os.makedirs('./传播智客/', exist_ok=True)  # 在当前程序的文件夹下创建一个“传播智客”的文件夹

    关于os的用法,可以参考各种基础教程。

  5. 因为这碗汤里啥都有,想吃的肉还得自己找。所以下一步就是找到图片网址对应的代码:

    for ul in img_ul:
        imgs = ul.find_all('img')
        # print(imgs)
        for img in imgs:
            url = img['data-original']
            img_name = url.split('/')[-1]
            req = requests.get(main_url+url, stream=True)
            with open('./传播智客/%s' % img_name, 'wb') as f:
                for chunk in req.iter_content(chunk_size=128):
                    f.write(chunk)
            print('Saved %s' % img_name)

    那么提取里面的内容就需要用到关键字标签,如上代码所示。

    本来打算用正则表达式“re.findall(xxxx)”提取网址,结果报错了。所以就没用到re模块。

  6.         with open('./传播智客/%s' % img_name, 'wb') as f:
                for chunk in req.iter_content(chunk_size=128):
                    f.write(chunk)

    这一段是跟  莫烦 学的。普通方法就是把所有的图片下载到内存里,再一个个存到电脑的硬盘上。对于少量的数据还可行,对于本例子也可行,但想想如果要爬一个20G 的视频呢?内存恐怕要被撑爆。这种方法说白了就是边下边存,本例子中,下载满128byte即存到硬盘上,然后再下再存。chunk_size=xx即定义了满多少字节存一次。

  7. 结果:

  8. 完整版代码:

    import requests
    from bs4 import BeautifulSoup
    import os
    
    
    ul = 'http://www.itcast.cn/channel/teacher.shtml#ajavaee'
    html = requests.get(ul).text
    main_url = 'http://www.itcast.cn'
    # print(html)
    soup = BeautifulSoup(html, 'lxml')
    img_ul = soup.find_all('div', {'class': 'li_img'})
    
    os.makedirs('./传播智客/', exist_ok=True)
    
    for ul in img_ul:
        imgs = ul.find_all('img')
        # print(imgs)
        for img in imgs:
            url = img['data-original']
            img_name = url.split('/')[-1]
            req = requests.get(main_url+url, stream=True)
            with open('./传播智客/%s' % img_name, 'wb') as f:
                for chunk in req.iter_content(chunk_size=128):
                    f.write(chunk)
            print('Saved %s' % img_name)
    

猜你喜欢

转载自blog.csdn.net/HollyRan/article/details/85250219