python的数据爬取基本思想

By | 2014/04/13

关于python的数据爬取,其基本思想就是将一个url连接的所有文本信息请求下来,然后从这些文本信息中筛选出自己所需要数据信息。

数据爬取往往分为爬取单页和爬取多页,爬取多页的方法一般有两种,一种是循环爬取,另一种是递归爬取。

首先,放一个爬取单个页面的例子:(注:爬取的是游民星空)

[code lang=”python”]

#coding=utf-8
import urllib2
import re

def downloadWithURL(url,filename):
try:
fp=urllib2.urlopen(url)
except:
print ‘download exception’
return 0
op = open(filename,"wb")#趴下来的网页存这里
while 1:
s = fp.read()
if not s:
break
op.write(s)

fp.close()
op.close()
return 1

def getdownloadURL(url):#使用正则表达式进行url的挖掘
try:
fp = urllib2.urlopen(url)
except:
print ‘get url exception’
return []
pattern = re.compile("http://www.gamersky.com/wenku/201404/352346.shtml")#正则表达式匹配
while 1:
s = fp.read()
if not s:
break
urls = pattern.findall(s)
fp.close()
return urls

def spider(startURL,times):#爬虫
urls = []
urls.append(startURL)
i=0;
while 1:
if i>times:
break
if len(urls)>0:
url = urls.pop(0)
print url,len(urls)
downloadWithURL(url,str(i)+’.htm’)#趴下来的网页
i=i+1
if len(urls)<times:
urllist = getURL(url)
for url in urllist:
if urls.count(url) == 0:
urls.append(url)
else:
break
return 1

spider("http://www.gamersky.com/wenku/201404/352346.shtml",2)

[/code]

接下来,写一个爬取多个页面的方法,方法的思想如下,向一个页面发起请求,然后获取页面信息,从一面信息中根据正则表达式进行筛选,将需要的url连接爬取下来,然后再对这些url连接发起请求,依次进行爬取,代码示例如下:

[code lang=”python”]
#coding=utf-8
import urllib2
import re

def downloadWithURL(url,filename):
try:
fp=urllib2.urlopen(url)
except:
print ‘download exception’
return 0
op = open(filename,"wb")#趴下来的网页存这里
while 1:
s = fp.read()
if not s:
break
op.write(s)

fp.close()
op.close()
return 1

def getdownloadURL(url):#使用正则表达式进行url的挖掘
try:
fp = urllib2.urlopen(url)
except:
print ‘get url exception’
return []
pattern = re.compile("http://www.gamersky.com/wenku")#正则表达式匹配,这里我们只筛选文库专栏中的信息
while 1:
s = fp.read()
if not s:
break
urls = pattern.findall(s)
fp.close()
return urls

def spider(startURL,times):#爬虫
urls = []
urls.append(startURL)
i=0;
while 1:
if i>times:
break
if len(urls)>0:
url = urls.pop(0)
print url,len(urls)
downloadWithURL(url,str(i)+’.htm’)#趴下来的网页
i=i+1
if len(urls)<times:
urllist = getURL(url)
for url in urllist:
if urls.count(url) == 0:
urls.append(url)
else:
break
return 1

spider("http://www.gamersky.com",2)
[/code]

这样,你就可以将多个页面爬取下来了。以后我还会在博客中讲明scrapy的使用方法。

发表评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据