Python爬虫小练习

前言

前一节在学完正则表达式后视频给了一个小练习:爬取某个网站的图片。就几行代码,不难。

自己本学期的一个小目标:做一个敏感信息过滤器。
首先得学会语音和图片处理,然后使用模型训练过滤器,最后进行分类预测。
核心在于训练数据抓取与处理,模型的选择。

本文,通过爬取某个网站的图片,初步接触爬虫技术。

步骤

  1. 导入相关Python包requests
  2. 选择要爬取的图片网站链接
  3. 分析网站源码观察图片链接特点
  4. 爬取网页源码
  5. 使用正则表达式过滤图片链接
  6. 根据图片链接获取图片信息
  7. 写入指定文件并给图片命名

导入相关包

1
2
import re # 处理正则表达式
import requests # 处理爬取请求

选择图片网站

url=‘http://www.xiaohuar.com/hua/‘
2019-09-13 22-18-54 的屏幕截图.png

分析源码

贴上部分源码:

1
2
3
4
5
6
<ul>
<li><a href="" ><img src="http://www.xiaohuar.com/skin/default/images/mr_2.gif" width="61" height="30" /></a></li>
<li><a href="http://www.xiaohuar.com/hua/" ><img src="http://www.xiaohuar.com/skin/default/images/zx_2.gif" width="61" height="30" /></a></li>
<li><a href="http://www.xiaohuar.com/2014.html"><img src="http://www.xiaohuar.com/skin/default/images/jx_2.gif" width="61" height="30" /></a></li>
<li><a href="http://www.xiaohuar.com/xiaocao/" ><img src="http://www.xiaohuar.com/skin/default/images/jx_3.gif" width="61" height="30" /></a></li>
</ul>

我们需要的是.jpg格式的图片链接,而这些链接前缀为src="",我们只需要""里面内容即可,但有的链接并不是完整http形式,如:<img width="210" alt="烟台大学校花王煜" src="/d/file/20190912/8774b906215adeae8963173b1e0df146.jpg">,故我们爬取之后需要加上网址前缀。

爬取网页源码

导入requests包之后,使用requests.get(url)即可获得链接资源信息。

1
2
3
resp=requests.get(url_1) # 获取源码
we_data=resp.text  # 将源码信息保存下来
# print(resp) # if net work well then except to see: <Response [200]>

过滤图片链接

这是前一节正则表达式的概念。

1
2
3
reg=re.compile(r'src="(.+?.jpg)"') # re.compile(r'src=\'(.+?.jpg)\'')
res=re.findall(reg,we_data) # 返回获取的网址列表
# print(res)

获取图片信息并写入文件

1
2
3
4
5
6
7
8
9
10
11
num=0 # 给图片编号
for i in res:
   if i.startswith('/d'): # 如果链接不是完整的http形式,则手动加上前缀
       i='http://www.xiaohuar.com' +i #
   # print(i)
   b=requests.get(i) # 获取图片信息
   with open(r'./craw_practise1_xiaohua/%s.jpg' %num,'wb') as f: # 写入文件,需要新建文件夹
       f.write(b.content)
f.close()
print('num_%s complete' % num)
num=num+1

所爬取的图片就不放上来了。
在爬取其他网站时,稍加更改也有用,但有的图片过大,爬取很慢。需要使用os包和其他相关包改进,最后封装成脚本。还有很多需要学习。

完整代码

读取本地图片

注意,我们所爬取的图片保存格式是.jpg,故在使用相关包时候留意是否只支持.png格式的图片。
我们可以在新建的本地文件夹下查看图片,也可以直接读取出来。

1
2
3
4
5
6
7
8
9
10
11
12
import matplotlib.pyplot as plt # 图片处理包

def show_picture(file,num):
for i in range(num):
path = file + str(i) + '.jpg' # str(i) = ('%d' %i)
       img=plt.imread(path) # 需要pillow包的支持,不然只能读.png格式的图片
       plt.subplot(num/7,7,i+1) # 在一个画布中划分子画布,指定显示区域
       plt.imshow(img)
plt.axis('off') #不显示坐标轴
plt.show()

show_picture(file='./craw_practise1_xiaohua/',num=49)

Figure_26.png

参考文献

  1. Python中读取、显示和保存图片的方法
  2. python3 读入一个jpg格式的图片,并转换长宽像素个数,然后进行绘制
  3. Python 多个图同时在不同窗口显示
  4. Python图形绘制