爬取网页内所有的url和meta标签,title标签

来源:互联网 发布:linux下shell编程技巧 编辑:程序博客网 时间:2024/05/20 03:47

这个东西实际是最基础的东西,但是也是遇到了很多的坑,在这里记录如下。
此时我手里有了各种网页,从网上用wget工具下载的各种网页源码文件,大多是html文件,有的是php等等,都能使用html的格式打开。
为了的提出网页里面的所有信息建立图表,为以后的数据挖掘做准备。明白目的之后,首先是相对于其他爬虫有点不同的是有了网页源码。省去了下载的环节

第一步 使用python将网页的源码打开

这里面我使用了一个很好用的库,beautifulsoup工具,此工具的下载和安装,网上有很多教程,基于bs4,另外我发现在pycharm中你点取改正之后的import也可以直接下载这些包,免去在cmd里面pip install。

还有一个问题:因为当时我处理的路径名和下载的html文件中有空格存在的,此时就遇到一个问题,如果在后期处理词向量则使用空格进行字符分割会遇到大麻烦,所以为了保证出来的文本字符符合要求,先要遍历数据集中所有的文件和目录,将其中所有的空格字符替换一下x.replace(’ ‘,”)
,这个真给我搞醉了,一中午总算解决了,速度够慢的,后来还卡在一个183的错误上,卡了半天。(昨天在这里写的没有保存)在清理文件和文件夹名字的空格中遇到一个错误,显示error183,经过仔细的巡查应该出现在系统的错误上,比如在一个文件夹下有两个文件一个文件是w(2).html 一个文件是w (2).html 在这两个文件中,当程序处理到w (2).html时会将里面的空格去掉造成,两个文件名相同,所以返回一个系统错误,所以只能选择处理这样的错误,看处理到那里就直接将文件删除或者手动修改。
完整的源码如下

#coding:utf-8#主要功能是将一个目录文件中所有的目录和文件名字的空格删除import osif True:    i=0    for parent, dirnames, filenames in os.walk(os.getcwd()):        if i!=0 :#因为提取的第一个目录为根目录,导致循环的第一步总是出错,所以写一个条件判断省去第一步            print parent            [x, s] = os.path.split(parent)            print os.path.join(x,s)            print os.path.join(x, s.replace(' ', ''))            #rename() 在使用的时候出现了很多次183的错误,原因是            #文件中有两个文件一个有空格一个没有空格,对有空格的文件进行操作之后就会导致命名相同,程序报错            os.rename(os.path.join(x,s), os.path.join(x,s.replace(' ', '')))            print x            print s            continue        else:            i=i+1

第二步 将网页中的url扣出来,直接使用的是匹配a标签内的href的值,加一个是否包含http的判断,将url存储起来。

第三步 扣取网页中meta信息,包括name=description ,keywords,还有p标签,li标签内部的文本等等

在beautiful中有一个很好用的方法是fand_all(),这个方法直接查找某个标签,然后对其直接操作就可以得到纯文本文件,所以在这里我直接谢了一个list将几个标签放进去了‘p’‘li’‘a’等等。
关于这个标签的问题,我一直也很奇怪到底哪些标签里面是有字符的,哪些是没有字符的,可以看到这几个标签基本上涵盖了所有的文本信息,所以,如有不对可以批评,后来发现实际‘meta’标签内的文本也是可以写在这个循环里面的,最后的版本中,将循环也写进去了,这里就不说了,随后会仿出来代码。
写一个循环之后,遍历每一个标签,使用一个方法处理得到文本代码如下

lists = ['p', 'a', 'td', 'li', 'span']for list in lists:     text1 = soup.find_all(list)     for c in text1:     x = strip_tags(str(c))     print(x.replace('\n', ' '))     if x != None:       sheet1.write(j, col_num, x.replace('\n', ' '))       col_num = col_num + 1

扣取出来文本之后,存在一个很小的错误,由于使用了记事本打开,这样记事本是一个含有utf-8 带BOM的编码格式,这样就造成在文件头虽然不显示,但是却有一些字符,造成半天不能把这些文本分割输出为单列的关键词数据,这是一个教训,下一次不要使用记事本打开txt文件,我使用了一个komo的工具,代码字体很像ubuntu 很好用。

第四步 提取每一个标签的关键字出来,

输入到google中搜索,经过TF_IDF的处理提取网页上面较为‘重要’的词,将这些词输入到google中进行搜索,得到排名靠前的url再次提取这些网页的关键词,这样就可以建立文本之间的联系。在这里google搜索的步骤,并没有自己写,我看了一篇博客,他介绍了自己写的工具,magic-google,github地址为https://github.com/howie6879/php-google 这一个工具使用了伪造浏览器信息和选用不同区域的google地址的方法来防止google的封锁。我们就不用造轮子了。代码我就不再放了,很简单,写两个循环,遍历所有训练文件,每个训练文件取TF_IDF值前几的关键词输入就ok

(不定时更新遇到的各种坑,做记录使用)