python3-小爬虫实现
一直很好奇python是如何去爬取网络上的资源,所以就去查了一些资料,写了一个小的爬虫,记录一下。
爬取成果:
小爬虫的功能
简单的抓取网页源代码中的图片url,并通过该url下载到指定的文件夹下。
代码编写
获取网页源码
实现该爬虫需要用到最基本的urllib库。
!注意:在python3中,urllib和urllib2进行了合并,现在只有一个urllib模块,urllib和urllib2的中的内容整合进了urllib.request。
# pthon2写法
# import urllib
from urllib import request
# 打开网页
page = request.urlopen('https://tieba.baidu.com/p/6178178568?red_tag=3569572802')
#读取源码
html_code = page.read()
#打印到控制台
print(html_code)
用正则表达式提取源码图片url
将上面的代码包装一下:
!注意:python3读取源码返回的是二进制字符串,需要进行解码操作【decode(‘utf-8’)】
from urllib import request
import re
# 获取网页源码
def get_html(url):
page = request.urlopen(url)
html = page.read()
return html
#正则表达式
reg = r'src="(http?.*?)"'
# 以src="开头,包含了http字符串,以.任意字符结尾的字符串
#OR
#reg = r'src="(.+?\.jpg)"'
reg_img = re.compile(reg, re.S)
# 数组去重
imglist = list(set(re.findall(reg_img, html_code.decode('utf-8'))))
x = 0
for img in imglist:
print(img)
下载图片保存到指定文件夹,加入交互操作(注入灵魂(☆_☆))
将上面的获取代码封装成函数,实现将下载的图片保存到当前工作路径下指定的文件夹中。并加入了交互的操作。
#coding=utf-8
from urllib import request
import re
import os
import random
import string
#获取网页源码
def get_html(url):
page = request.urlopen(url)
html_code = page.read()
return html_code
#获取图片url,下载图片并保存到指定文件夹。
def get_image(html_code):
reg = r'src="(http?.*?)"'
reg_img = re.compile(reg, re.S)
imglist = list(set(re.findall(reg_img, html_code.decode('utf-8'))))
x = 0
#生成一个随机码
y = ''.join(random.sample(string.ascii_letters + string.digits, 8))
print(u'****生成文件夹*******')
# os.getcwd()获取当前工作区路径
dir = os.getcwd()+'\img'+y
print(u'****创建文件文件夹*******')
# 创建该文件夹
os.mkdir(dir)
print(dir)
for img in imglist:
#将图片下载到创建的随机文件夹下
request.urlretrieve(img, dir + '\\%s.jpg' % x)
x += 1
print(u'*******************网页图片抓取***************')
print(u'请输入url:'),
url = input()#获取用户输入
if url:
pass
else:
print(u'*****没有地址,使用默认地址*****')
url = 'http://tieba.baidu.com/p/6180617680'
print(u'*******************正在获取网页***************')
html_code = get_html(url)
print(u'*******************正在下载图片***************')
get_image(html_code)
print(u'*******************下载成功***************')
参考:https://www.cnblogs.com/Axi8/p/5757270.html