分享

python爬虫实践之网页抓取 | IT瘾

 DDI2014 2015-11-08
python自带了urllib和urllib2模块,以及第三方的requests库来抓取网页,这里我们使用easy_install包管理工具下载requests库,BeautifulSoup库,在CMD命令行下,切换到easy_install的目录,运行命令easy_install 包名称。

easy_install requests

安装好requests包之后,我们就可以选择使用urllib,urllib2或requests库来抓取网页了

1.网页内容的抓取

#! /usr/bin/env python#coding:utf-8import urllibimport urllib2import requestsimport sysurl = 'http://www.csdn.net'def urllib2Test():	req = urllib2.Request(url)	response = urllib2.urlopen(req)	thePage = response.read()def requestsTest():	r = requests.get(url)	r.status_code	r.content	r.headersdef urllib2TestEx(url):	req = urllib2.Request(url)	try:		response = urllib2.urlopen(req)		content = response.read()	except urllib2.URLError,e:		print e.reasondef urlhttperror(url):	req = urllib2.Request(url)	try:urllib2.urlopen(req)	except urllib2.HTTPError,e:		print e.read()if __name__ == '__main__':	urllib2Test()	requestsTest()	urllib2TestEx(url)	urlhttperror(url)


2.爬虫伪装成浏览器的访问

在访问一些网站时,会出现HTTPError: HTTP Error 403: Forbidden这样的异常,这是由于现在有些网站禁止爬虫访问,爬虫会带来服务器上的负担,爬虫和浏览器发出的http请求区别在于:当用户发送一个http请求的时候,浏览的的版本信息也包含在了http请求信息中,而爬虫就不包含头信息,当服务器端收到一个页面访问请求时,如果不知道发送这个请求使用的浏览器,操作系统,硬件平台等信息,这些信息在HTTP协议的中的一个字段User-agent中,缺失这些信息,服务器会认为这些请求是非正常的访问,我们用Fiddler工具就可以看到浏览器的请求的信息. 


对于禁止爬虫的网站,可以伪装成浏览器访问,在请求中加入UserAgent的信息。
添加和修改
headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
req = urllib2.Request('http://blog.csdn.net/nevasun', headers=headers)

伪装成浏览器访问如下
#! /usr/bin/env python#coding:utf-8import requestsfrom BeautifulSoup import BeautifulSoupfrom os.path import dirname, abspathimport sysimport os#PREFIX = dirname(abspath(__file__))## 这段代码是用于解决中文报错的问题  reload(sys)  sys.setdefaultencoding('utf8')  ##################################################### defaultWaitTime = 1def getHtmlContent(url):	global defaultWaitTime	content = None	retry = 0	headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36'}	AccessFrequency = defaultWaitTime	while retry < 5:		try:			r = requests.get(url,timeout=10,headers=headers)			content = r.content			return content		except:			retry+=1			time.sleep(AccessFrequency)	return contentdef Test():	content = getHtmlContent('http://blog.csdn.net/figo829/article/details/18015537')#	print contentif __name__ == '__main__':	Test()



作者:figo829 发表于2014-1-12 0:04:32 原文链接
阅读:0 评论:0 查看评论

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多