Python爬虫入门——爬取百度贴吧图片


首先来爬取这个网址中的图片:http://tieba.baidu.com/p/2166231880,Python3.6:

代码如下:

# 爬取贴吧图片,网址:http://tieba.baidu.com/p/2166231880

import urllib.request
import re
import os

def fetch_pictures(url):
    html_content = urllib.request.urlopen(url).read()
    r = re.compile('<img pic_type="0" class="BDE_Image" src="(.*?)"')
    picture_url_list = r.findall(html_content.decode('utf-8'))

    os.mkdir('pictures')
    os.chdir(os.path.join(os.getcwd(), 'pictures'))    
    for i in range(len(picture_url_list)):
        picture_name = str(i) + '.jpg'
        try:
            urllib.request.urlretrieve(picture_url_list[i], picture_name)
            print("Success to download " + picture_url_list[i])
        except:
            print("Fail to download " + picture_url_list[i])
if __name__ == '__main__':
    fetch_pictures("http://tieba.baidu.com/p/2166231880")

运行之后,会生成一个名为pictures的文件夹,自动下载图片并存放进去。


为了测试该程序,我看了另一个Python爬虫的代码,准备把网址替换一下,即爬取这个网址中的图片:http://tieba.baidu.com/p/2460150866 ,只需要将上述代码稍作修改(把网址换一下,文件夹改一下)即可,如下

# 爬取贴吧图片,网址:
 
import urllib.request
import re
import os

def fetch_pictures(url):
    html_content = urllib.request.urlopen(url).read()
    r = re.compile('<img pic_type="0" class="BDE_Image" src="(.*?)"')
    picture_url_list = r.findall(html_content.decode('utf-8'))

    os.mkdir('photos')
    os.chdir(os.path.join(os.getcwd(), 'photos'))
    for i in range(len(picture_url_list)):
        picture_name = str(i) + '.jpg'
        try:
            urllib.request.urlretrieve(picture_url_list[i], picture_name)
            print("Success to download " + picture_url_list[i])
        except:
            print("Fail to download " + picture_url_list[i])
if __name__ == '__main__':      
    fetch_pictures("http://tieba.baidu.com/p/2460150866")

爬取的图片会存放在photos文件夹中,截图如下: 

happysneaker.com


好的,那下面就来爬取一组明星的图片吧,比如刘诗诗,网址如下:http://tieba.baidu.com/p/2854146750 ,如果仍然直接把代码中的网址和文件夹名改一下,会发现并没有下载成功。所以,编程还是得老老实实看代码啊,光想着直接换个网址实在太偷懒(当然,想法可以有,这样才可以写出更智能、更进步的程序嘛)。

代码在抓取网页之后,利用正则表达式找到了图片的网址(URL),即关键在代码的这一行

r = re.compile('<img pic_type="0" class="BDE_Image" src="(.*?)"')


上面那两个例子之所以会成功,是因为网页源代码中(可以用谷歌浏览器查看)图片的网址确实是这个形式的,所以匹配到了。而刘诗诗照片的网址呢,查看一下,是这样的: 

也就是里面img标签里的代码形式是不一样的,不是

<img pic_type="0" class="BDE_Image" src="(.*?)"

而是

<img class="BDE_Image" src="(.*?)" pic_ext="jpeg"  pic_type="0"

所以要把正则表达式的内容修改一下,整体代码如下:

# 爬取贴吧刘诗诗的图片,网址:http://tieba.baidu.com/p/2854146750

import urllib.request
import re
import os

def fetch_pictures(url):
    html_content = urllib.request.urlopen(url).read()
    r = re.compile('<img class="BDE_Image" src="(.*?)" pic_ext="jpeg"  pic_type="0"')
    picture_url_list = r.findall(html_content.decode('utf-8'))

    os.mkdir('liushishi')
    os.chdir(os.path.join(os.getcwd(), 'liushishi'))
    for i in range(len(picture_url_list)):
        picture_name = str(i) + '.jpg'
        try:
            urllib.request.urlretrieve(picture_url_list[i], picture_name)
            print("Success to download " + picture_url_list[i])
        except:
            print("Fail to download " + picture_url_list[i])
        
if __name__ == '__main__':
    fetch_pictures("http://tieba.baidu.com/p/2854146750")


运行后,爬取成功,截图如下:

happysneaker.com

所以下载图片的关键在于正则表达式的匹配。


以下是个简单的小案例:网址是:http://tieba.baidu.com/p/3884688092 ,代码如下:

# 爬取贴吧图片,网址:http://tieba.baidu.com/p/3884688092

import urllib.request
import re
import os

def fetch_pictures(url):
    html_content = urllib.request.urlopen(url).read()
    r = re.compile('<img class="BDE_Image" pic_type="\d" width="\d\d\d" height="\d\d\d" src="(.*?)"')
    picture_url_list = r.findall(html_content.decode('utf-8'))

    os.mkdir('test')
    os.chdir(os.path.join(os.getcwd(), 'test'))
    for i in range(len(picture_url_list)):
        picture_name = str(i) + '.jpg'
        try:
            urllib.request.urlretrieve(picture_url_list[i], picture_name)
            print("Success to download " + picture_url_list[i])
    except:
            print("Fail to download " + picture_url_list[i])
    
if __name__ == '__main__':
    fetch_pictures("http://tieba.baidu.com/p/3884688092")

关键仍在于正则表达式那一行:

r = re.compile('<img class="BDE_Image" pic_type="\d" width="\d\d\d" height="\d\d\d" src="(.*?)"')


Unity那些事儿
请先登录后发表评论
  • 最新评论
  • 总共0条评论