python爬虫(6)爬虫实例(2)

import urllib.request
import re


# 获取网页的html,与requests包一样的功能
def getHtml(url):
    response = urllib.request.Request(url, headers=header)
    page = urllib.request.urlopen(response)
    html = page.read()  # urllib用read()读取html;requests包用text读取html
    print(html)
    return html


# 获取图片对应的src属性代码
def getImg(html):
    html = html.decode('utf-8')

    # 通过re-compile-findall二连函数操作来获取图片src属性对应的代码
    src = r'https://[^\s]*?\.jpg'
    imgre = re.compile(src)  # re.compile(),可以把正则表达式编译成一个正则表达式对象
    imglist = re.findall(imgre, html)
    # re.findall(),读取html中包含imgre(正则表达式)的数据,imglist是包含了所有src元素的数组

    # 用urlretrieve下载图片。图片命名为0/1/2...之类的名字
    x = 0
    for imgurl in imglist:
        # 注意,这里的文件路径,每段路径的首字母一定要大写!!小写会识别出错
        urllib.request.urlretrieve(imgurl, 'E:%s.jpg' % x)  #下载到指定路径
        x += 1
        print(imgurl)


header = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}
html = getHtml("https://tieba.baidu.com/p/5439602441")
getImg(html)
print('OK')

python爬虫(6)爬虫实例(2)
本例知识点

urllib.requests模块,用Requests、openurl来请求网页,用read()来读取出html,用urlretrieve来直接下载文件到制定目录;

re包中,用re-compile-findall来获取图片对应的src属性代码,这是一个常用的套路,类似于BeautifulSoup的soup-find_all-get三连击;

在正则表达式中,对于下面的长代码,直接用https://[^\s]*?.jpg来代替就可以了。具体每个字符的含义,可以自行查表,但是这个短代码串,是可以在很多爬虫中通用的。牢牢记住,再来变通。
https://imgsa.baidu.com/forum/w%3D580/sign=4c9a9f3955df8db1bc2e7c6c3921dddb/abf17d1ed21b0ef40b2f06ffd6c451da80cb3e7a.jpg

此外,还有一些小问题。例如,对于html此处还要用decode来解码(具体原因还不清楚),Python在文件路径上只能识别首字母为大写的文件。这些小问题,就需要开发者在实际中慢慢体会了;

提供了将下载的图片命名为1,2,3…等数字的方法,即:将变量x插入到下载和命名过程,每执行一次for函数,x就自加一次即可。