cover_image

Python 爬虫第一篇(urllib+regex)

keinYe keinYe
2019年03月15日 23:58

爬虫的主要用途即从网站上获取网页,并将网页中的有用信息解析出来。从网站上获取网页内容可以通过 python 内置的 urllib 模块来实现,至于信息的解析说起来比较复杂,python 中可以使用的模块也有很多,今天我们主要使用正则表达式「python 内置的 re 模块」来实现数据的解析。

前面有对 python 内置的 urllib 模块和 re 模块做过简单的介绍有兴趣的朋友可以了解一下

  1. 初识 Python 网络请求库 urllib

  2. Python 正则表达式

今天我们准备使用 urllib 和 re 模块来实现爬虫的功能将网页中的数据数据读取出来。

确定目标

我们的目标是获取立创商城上元器件的阶梯价格「不同的采购数量对应的价格不同」。先来看下网页的图

图片

我们想要的数据在这里图片

实施方案

首先我们可以后去到该网页的网址 'https://item.szlcsc.com/213095.html'。可以使用 urllib.urlopen 方法读取网页内容

  1. url = 'https://item.szlcsc.com/213095.html'

  2. response = urllib2.urlopen(url)

  3. html_text = response.read().decode('utf-8')

要获取阶梯价格的信息,我们先来看一下这段所对应的 html 内容:

图片

从图上可以看出每个阶梯价格有 tr 标签进行分割,而每行的中的数量和对应的价格使用 td 标签进行显示。我们可以使用以下正则表达式来提取数量和价格内容。

  1. # 提取每个阶梯价格的正则表达式

  2. '<tr class="sample_list_tr">(.*?)</tr>'

  3. # 提取一行中的数量

  4. '<td width="40%" align="right">(.*?)</td>'

  5. # 提取一行中的价格

  6. "<p class='goldenrod'>(.*?)</p>"

现在我们来看一下完整的程序

  1. # -*- coding:utf-8 -*-


  2. import urllib2

  3. import re


  4. def find_number(str):

  5. '''

  6. 获取每一行中的数量范围

  7. '''

  8. res = r'<td width="40%" align="right">(.*?)</td>'

  9. find_str = re.findall(res, str, re.S)[0]

  10. # 去除单位

  11. res_2 = '[1-9]{1}[\\d ~\\s]*\\d'

  12. find_str = re.findall(res_2, find_str, re.S)[0]

  13. # 去除字符串中的空格

  14. strinfo = re.compile('[\\s]')

  15. return re.sub(strinfo, '', find_str)


  16. def find_price(str):

  17. '''

  18. 获取每一行中的价格信息

  19. '''

  20. res = r"<p class='goldenrod'>(.*?)</p>"

  21. find_str = re.findall(res, str, re.S)

  22. # 若无对应的价格是显示 None

  23. if len(find_str):

  24. # 去除价格中的单位

  25. res_2 = '[1-9]{1}[\\d\\.]*'

  26. find_str = re.findall(res_2, find_str[0], re.S)

  27. return find_str[0]

  28. else:

  29. return 'None'


  30. url = 'https://item.szlcsc.com/213095.html'

  31. # 读取网页内容,并解码相关内容

  32. response = urllib2.urlopen(url)

  33. html_text = response.read().decode('utf-8')

  34. res_tr = r'<tr class="sample_list_tr">(.*?)</tr>'

  35. m_tr = re.findall(res_tr, html_text, re.S)

  36. print '%4s | %10s | %5s' %('序号', '数量', '单价')

  37. print "-------------------------"

  38. for n, value in enumerate(m_tr):

  39. print '%4d | %10s | %5s' %(n + 1, find_number(value), find_price(value))

  40. print "-------------------------"

检验结果

代码已经编写完成,现在我们来验证一下执行的效果,以上代码的执行结果如下:

  1. 序号 | 数量 | 单价

  2. -------------------------

  3. 1 | 1~9 | 9.21

  4. -------------------------

  5. 2 | 10~29 | 6.81

  6. -------------------------

  7. 3 | 30~99 | 6.37

  8. -------------------------

  9. 4 | 100~499 | 5.93

  10. -------------------------

  11. 5 | 500~999 | 5.73

  12. -------------------------

  13. 6 | 1000 | 5.64

  14. -------------------------

对比执行结果与前面我们看到的网页信息,可以看到程序正常执行且得到正确的结果。

想在我们将网址更换为 'https://item.szlcsc.com/8796.html',网页显示如下:图片此时我们再次执行程序,得到以下结果:

  1. 序号 | 数量 | 单价

  2. -------------------------

  3. 1 | 1~9 | 13.82

  4. -------------------------

  5. 2 | 10~29 | 11.75

  6. -------------------------

  7. 3 | 30~99 | 11.37

  8. -------------------------

  9. 4 | 100~499 | 10.99

  10. -------------------------

  11. 5 | 500~999 | 10.82

  12. -------------------------

  13. 6 | 1000~1999 | 10.61

  14. -------------------------

  15. 7 | 2000 | None

  16. -------------------------

可以看到以上结果与网页中的内容完全相同,代码完成了我们的预定功能。

注意:此代码在 python 2.7.10 版本验证。


继续滑动看下一个
因网络连接问题,剩余内容暂无法加载。
keinYe
向上滑动看下一个