从零开始写爬虫
一、遍历网站的全部页面
思路
要遍历一个网站的全部页面,要做的就是先打开目标网站的源码,从中提取所有的URL,然后再逐个遍历,并保存已处理过的URL。
1.提取URL
从一堆HTML中提取可用的URL是一件轻松的事,处理的方法也有很多。
- 正则表达式提取
- BeautifulSoup提取
- 自带库sgmlib中的SGMLParser类
这里就试试第三种方法。
2.存储URL
提取出URL后,分开存储刚刚提取出来的URL和已经处理过的URL就是接下来要解决的问题。
一开始想过存在列表里面,但是从中提取和pop出URL的顺序又成了问题,所以这里采用Python自带的队列数据结构。
然后处理完的URL就直接存入文件,并且计数,即为已经访问到的页面数量。
3.实现函数
接下来的任务就是运行函数来处理URL了,但是我现在用的只是最笨的递归,效率低下不说,对内存也是一个很大的考验。所以之后会通过多线程编程来解决这个问题,把URL放入内存池中,规定每次允许运行的线程数,这样就能在一定程度上提升效率和速度了。
4.具体代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
|
import re import Queue import urllib2 from sgmllib import SGMLParser
url_queue = Queue.Queue(0) url_num = 0
class find_url(SGMLParser): """docstring for find_url store the urls into url_new
""" def __init__(self): SGMLParser.__init__(self) self.url_new = []
def start_a(self, attrs): href = [v for k, v in attrs if k=='href'] if re.match(r'^https?:/{2}\w.+$', "".join(href)): self.url_new.extend(href)
def open_url(): url = url + 1
url_given = url_queue.get()
url_traversed.write(url_given + "\n")
content = urllib2.urlopen(url_given).read() result = find_url() result.feed(content) for urls in result.url_new: url_queue.put(urls)
while not url_queue.empty(): open_url()
if __name__ == '__main__':
url = "http://movie.douban.com"
url_traversed = open('URLSTORE.txt', 'w')
url_queue.put(url)
open_url()
url_traversed.closed()
print "The number of the traversed URL is %d" % url_num ```
我现在还是用的最笨的方法,即直接打开包含需要搜索内容的URL,就能得到搜索页面的源码。
用POST和GET提交的方法下次再用。
用BeautifulSoup查找<div>标签间的内容,但是这个还是只能大概地过滤,并不能很精准地返回搜索内容。
1. 用POST和GET方法提交搜索。 2. 细致地处理返回的搜索结果。 3. 遍历所有的搜索结果。
```Python
import sys import urllib2 from bs4 import BeautifulSoup
reload(sys) sys.setdefaultencoding('utf8')
def search_baidu(): url = urllib2.urlopen("http://www.baidu.com/s?wd=site:(nuist.edu.cn)%20?")
urltmp = url.read()
soup = BeautifulSoup(urltmp)
res = soup.find(name='div').getText('\n')
ss = open('ss.txt', 'w') ss.write(res) ss.close()
search_baidu()
|