黑帽联盟

标题: Python利用正则抓取网页内容保存到本地 [打印本页]

作者: yun    时间: 2017-1-21 16:10
标题: Python利用正则抓取网页内容保存到本地
目标是收集国内银行的域名列表,于是在人行的网站上找到了汇总信息,网址是http://www.cbrc.gov.cn/chinese/jrjg/index.html
截图是
python抓取内容

查看一下他的html源码,需要抓取部分的是:

  1. <li
  2.                                                     style="margin: 0px 10px 0px 5px; width: 120px; float: left; height: 30px; display: inline;">
  3.                                                     <a  target="_blank"  style="color:#08619D">
  4.                                                                                                             中国工商银行
  5.                                                                                                          </a>
  6.                                                 </li>
  7.                                                                                                                                                                                                                                                        <li
  8.                                                     style="margin: 0px 10px 0px 5px; width: 120px; float: left; height: 30px; display: inline;">
  9.                                                     <a  target="_blank"  style="color:#08619D">
  10.                                                                                                             中国农业银行
  11.                                                                                                          </a>
  12.                                                 </li>
复制代码
提炼一下,我们需要提取的是Url和银行的名称,那么可以先把源码中的t删除,然后用正则表达式匹配

<a href="(.*)" target="_blank" style="color:#08619D">\r\n(.*)\r\n</a>

分析完毕,下面是代码实现了,第一个版本如下:



首先声明一个浏览器对象,并修改了其http头的user-agent信息;然后打开Url,获取Html源码,并将't'删除;之后利用Python的正则匹配,将Url和银行名称提炼出来;最后将这些信息写入到文件中。注意一点,print到屏幕上时,需要将中文字符解码为utf-8才能打印,写入文件是不需要的。

那么升级一下,我需要的不是url,而是银行对应的域名,可以用tld模块来提取import部分添加

from tld import get_tld
在使用tld模块从url提取域名的过程中,会发现莫名其妙的问题,不知道是提取正则提取Url时,url不规范导致的还是其他原因,总有一些Url没法提取域名,于是会发生报错信息,我这边从新写了一下,增加容错性

def my_get_tld(url):
    try:
        str = get_tld(url = url,fail_silently=True)
        if str == None:
            return ''
        else:
            return str.encode('utf8')
    except:
        return ''
于是写入文本的代码修改成

with open(u'金融.txt','wb') as fp:
    str1 = ''
    for domain in domainlist:
            str1 += domain[1]+ '----' + domain[0] + '----' + my_get_tld(url = domain[0]) + '\r\n'
    fp.write(str1)
OK,运行之后就可以得到需要的内容了

python批量抓取内容





欢迎光临 黑帽联盟 (https://bbs.cnblackhat.com/) Powered by Discuz! X2.5