基于python的网络爬虫设计.docx
《基于python的网络爬虫设计.docx》由会员分享,可在线阅读,更多相关《基于python的网络爬虫设计.docx(11页珍藏版)》请在冰豆网上搜索。
基于python的网络爬虫设计
基于python的网络爬虫设计
基于python的网络爬虫设计
【摘要】近年来,随着网络应用的逐渐扩展和深入,如何高效的获取网上数据成为了无数公司和个人的追求,在大数据时代,谁掌握了更多的数据,谁就可以获得更高的利益,而网络爬虫是其中最为常用的一种从网上爬取数据的手段。
网络爬虫,即WebSpider,是一个很形象的名字。
如果把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛。
网络蜘蛛是通过网页的链接地址来寻找网页的。
从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止。
如果把整个互联网当成一个网站,那么网络蜘蛛就可以用这个原理把互联网上所有的网页都抓取下来。
那么,既然网络爬虫有着如此先进快捷的特点,我们该如何实现它呢?
在众多面向对象的语言中,首选python,因为python是一种“解释型的、面向对象的、带有动态语义的”高级程序,可以使人在编程时保持自己的风格,并且编写的程序清晰易懂,有着很广阔的应用前景。
关键词python爬虫数据
1前言
1.1本编程设计的目的和意义
随着网络的迅速发展,万维网成为大量信息的载体,如何有效地提取并利用这些信息成为一个巨大的挑战。
搜索引擎(例如传统的通用搜索引擎AltaVista,Yahoo!
和Google等)作为一个辅助人们检索信息的工具成为用户访问万维网的入口和指南。
但是,这些通用性搜索引擎也存在着一定的局限性,如:
(1)不同领域、不同背景的用户往往具有不同的检索目的和需求,通用搜索引擎所返回的结果包含大量用户不关心的网页。
(2)通用搜索引擎的目标是尽可能大的网络覆盖率,有限的搜索引擎服务器资源与
(1)缘网,加入变量打开多个网页。
(2)通过python的urllib2函数进行世纪佳缘网源代码的获取。
(3)用正则表达式分析源代码,找到所需信息导入excel。
(4)连接数据库,将爬下的数据存储在数据库中。
1.3本编程设计应达到的要求
1、对特定的网站爬取特定的数据;
2、实现代码和得到结果;
3、能够和数据库进行连接,将爬下的数据存储在数据库中。
4、将爬下的数据储存在excel中方便编辑。
2编程设计方案
2.1爬取方案
2.1.1所需爬取的数据
以世纪佳缘网为例,所需要爬取的数据为注册世纪佳缘网的人的用户名、真实姓名、性别、年龄、学历、月收入这些直观信息。
2.1.2用python获取世纪佳缘网的源代码
爬虫最主要的处理对象就是URL,它根据URL地址取得所需要的文件内容,然后对它进行进一步的处理。
因此,准确地理解URL对理解网络爬虫至关重要。
URL是URI的一个子集。
它是UniformResourceLocator的缩写,译为“统一资源定位符”。
通俗地说,URL是Internet上描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上。
采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。
URL的格式由三部分组成:
①第一部分是协议(或称为服务方式)。
②第二部分是存有该资源的主机IP地址(有时也包括端口号)。
③第三部分是主机资源的具体地址,如目录和文件名等。
第一部分和第二部分用“:
//”符号隔开,
第二部分和第三部分用“/”符号隔开。
第一部分和第二部分是不可缺少的,第三部分有时可以省略。
例如:
其计算机域名为;超级文本文件(文件类型为.html)是在目录/talk下的talk1.htm。
这是瑞得聊天室的地址,可由此进入瑞得聊天室的第1室。
Python获取网页源代码可用urllib或urllib2函数进行,极其方便快捷,代码如下:
import urllib2
response = urllib2.urlopen('
html = response.read()
print html
2.1.3应用python伪装成浏览器自动登陆世纪佳缘网,加入变量打开多个网页。
有了源代码就可以进行数据的爬取了,但是因为世纪佳缘网近日进行了改版,简单的爬虫程序已经无法在对其进行全网页的爬取工作了,所以,在获取数据之前,需要对爬虫进行一下伪装,使其成为一个浏览器,以实现全网页的爬取工作。
应用opener和header的基础知识即可实现伪装成浏览器这一步骤。
在伪装的同时,需要加入变量来打开多个网页,是的爬取工作可以顺利进行。
代码如下:
r=0
w=3013
while3012w=w+1
k=str(w)
login_page="
cj=cookielib.CookieJar()
opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
opener.addheaders=[('User-agent','Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1)')]
data=urllib.urlencode({"name":
"834054996@","password":
"benben12"})
opener.open(login_page,data)
op=opener.open("
html=op.read()
2.14用正则表达式分析网页源代码
正则表达式是用于处理字符串的强大工具,它并不是Python的一部分。
其他编程语言中也有正则表达式的概念,区别只在于不同的编程语言实现支持的语法数量不同。
它拥有自己独特的语法以及一个独立的处理引擎,在提供了正则表达式的语言里,正则表达式的语法都是一样的。
下图为使用正则表达式进行匹配的流程:
正则表达式的大致匹配过程是:
1.依次拿出表达式和文本中的字符比较,
2.如果每一个字符都能匹配,则匹配成功;一旦有匹配不成功的字符则匹配失败。
3.如果表达式中有量词或边界,这个过程会稍微有一些不同。
Python是通过re模块实现对正则表达式的调用的。
程序代码如下:
find_re=pile(r"absolute.+?
span>(.*?
)
>>(.*?
).+?
(.*?
)
(.*?
)
(.*?
)
(.*?
)
",re.DOTALL)
2.2存储方案
2.2.1储存在excel表格中
Excel表格具有方便筛选、查找和编辑的特点,所以将网络爬虫爬取的数据储存在excel表格中是首选。
使用python建立excel表格是十分容易,代码如下:
filename=xlwt.Workbook()
sheet=filename.add_sheet('name')
建立完成后可将数据写入excel表格:
forainx:
sheet.write(r,0,a[0].decode("utf-8"))
sheet.write(r,1,a[1].decode("utf-8"))
sheet.write(r,2,a[2].decode("utf-8"))
sheet.write(r,3,a[3].decode("utf-8"))
sheet.write(r,4,a[4].decode("utf-8"))
sheet.write(r,5,a[5].decode("utf-8"))
r=r+1
printr+3012
filename.save('test3.xls')
2.2.2储存在数据库中
数据库指的是以一定方式储存在一起、能为多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。
将数据储存在数据库中也具有直观简洁的特点。
Python调用数据库是用pymongo模块,创建与导入代码如下:
db=pymongo.Connection().test
forainx:
values=dict(
img=a[0].decode("utf-8"),
infor=a[1].decode("utf-8"),
age=a[2].decode("utf-8"),
adress=a[3].decode("utf-8"),
marry=a[4].decode("utf-8")
)
db.user.insert({'values':
values})
content=db.user.find()
forainx:
print'img:
'+a[0].decode("utf-8")
print'infor:
'+a[1].decode("utf-8")
print'age:
'+a[2].decode("utf-8")
print'adress:
'+a[3].decode("utf-8")
print'marry:
'+a[4].decode("utf-8")
3、总结
本程序利用了python语言编写网络爬虫程序,实现了从世纪佳缘网上爬取用户数据资料,使用urllib函数以及re模块、pymongo模块进行源代码的获取、编辑和数据的导出,并针对网页代码中无性别显示的问题,采取爬取注册用户信息同时爬取注册用户照片地址的方式解决,浏览所爬取信息时,只需将照片地址输入浏览器地址栏,即可得到所查看用户上传的自拍照,得到形象信息。
总的来说程序设计简便、实用性强、便于读取和再利用。
4、附录
4.1将爬取数据储存在excel表格
4.1.1源代码
#coding=gbk
importre
importxlwt
importcookielib
importurllib,urllib2#
filename=xlwt.Workbook()
sheet=filename.add_sheet('name')
find_re=pile(r"absolute.+?
span>(.*?
)
>>(.*?
).+?
(.*?
)
(.*?
)
(.*?
)
(.*?
)
",re.DOTALL)
r=0
w=3013
while3012w=w+1
k=str(w)
login_page="
cj=cookielib.CookieJar()
opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
opener.addheaders=[('User-agent','Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1)')]
data=urllib.urlencode({"name":
"834054996@","password":
"benben12"})
opener.open(login_page,data)
op=opener.open("
html=op.read()
x=find_re.findall(html)
forainx:
sheet.write(r,0,a[0].decode("utf-8"))
sheet.write(r,1,a[1].decode("utf-8"))
sheet.write(r,2,a[2].decode("utf-8"))
sheet.write(r,3,a[3].decode("utf-8"))
sheet.write(r,4,a[4].decode("utf-8"))
sheet.write(r,5,a[5].decode("utf-8"))
r=r+1
printr+3012
filename.save('test3.xls')
4.1.2爬取数据汇总截图
4.2将爬取数据写入数据库
4.2.1源代码
#coding=gbk
importurllib
importre
importpymongo
db=pymongo.Connection().test
find_re=pile(r"absolute.+?
span>(.*?
)
>>(.*?
).+?
(.*?
)
(.*?
)
(.*?
)
",re.DOTALL)
w=11
while10w=w+1
k=str(w)
page=urllib.urlopen("
html=page.read()
x=find_re.findall(html)
forainx:
values=dict(
img=a[0].decode("utf-8"),
infor=a[1].decode("utf-8"),
age=a[2].decode("utf-8"),
adress=a[3].decode("utf-8"),
marry=a[4].decode("utf-8")
)
db.user.insert({'values':
values})
content=db.user.find()
forainx:
print'img:
'+a[0].decode("utf-8")
print'infor:
'+a[1].decode("utf-8")
print'age:
'+a[2].decode("utf-8")
print'adress:
'+a[3].decode("utf-8")
print'marry:
'+a[4].decode("utf-8")
4.2.2爬取数据汇总截图
参考文献
(1)Guidovanrossum《Python手册》
(2)MagnusLieHetlar《python基础教程》
(3)罗刚,王振东《自己动手写网络爬虫》