使用Python的urllib和urllib2模块制作爬虫的实例教程
urllib
1.做一个简单的爬虫程序
这个没有什么好说的,直接上代码吧! ''' @ urllib为python自带的一个网络库 @ urlopen为urllib的一个方法,用于打开一个连接并抓取网页,然后通过read()方法把值赋给read() ''' import urllib url = "http://www.lifevc.com"#多嘴两句,为什么要选lifevc呢,主要是最近它很惹我. html = urllib.urlopen(url) content = html.read() html.close() #可以通过print打印出网页内容 print content 很简单,基本上没有可说的,这个也就是python的魅力,几行代码就完成. 2.小试牛刀 打开网页,右键点击,选择"inspect Element"(最下面这一项) 下面将源码相关拷贝出来 <img class="BDE_Image" src="/uploads/201701/10/14840392612. jpg" height="840" width="560" style="cursor: url(http://tb2.bdstatic.com/tb/ static-pb/img/cur_zin.cur),pointer;"> 经分析和对比(这里略掉),基本上可以看到要抓取的图片几个特征:
正则表达式后续我会更新,请关注 依照上述判断,直接上代码 ''' @本程序用来下载百度贴吧图片 @re 为正则说明库 ''' import urllib import re # 获取网页html信息 url = "http://tieba.baidu.com/p/2336739808" html = urllib.urlopen(url) content = html.read() html.close() # 通过正则匹配图片特征,并获取图片链接 img_tag = re.compile(r'class="BDE_Image" src="(.+?.jpg)"') img_links = re.findall(img_tag,content) # 下载图片 img_counter为图片计数器(文件名) img_counter = 0 for img_link in img_links: img_name = '%s.jpg' % img_counter urllib.urlretrieve(img_link,"//Users//Sean//Downloads//tieba//%s" %img_name) img_counter += 1 如图,我们就抓取你懂的图片 3.总结
或者https://docs.python.org/2/library/index.html进项相关搜索. 当然百度也可以,但是效率太低.建议使用 http://xie.lu 进行相关搜索(你懂了,绝对满意). urllib2
1.抓取受限网页 首先使用我们上一节学到的知识测试一下: ''' @本程序用来抓取blog.csdn.net网页 ''' import urllib url = "http://blog.csdn.net/FansUnion" html = urllib.urlopen(url) #getcode()方法为返回Http状态码 print html.getcode() html.close() #输出 403 此处我们的输出为403,代表拒绝访问;同理200表示请求成功完成;404表示网址未找到.
以下就是整理后的Header信息 Request Method:GET Host:blog.csdn.net Referer:http://blog.csdn.net/?ref=toolbar_logo User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/38.0.2125.104 Safari/537.36 然后根据提取的Header信息,利用urllib2的Request方法模拟浏览器向服务器提交请求,代码如下: # coding=utf-8 ''' @本程序用来抓取受限网页(blog.csdn.net) @User-Agent:客户端浏览器版本 @Host:服务器地址 @Referer:跳转地址 @GET:请求方法为GET ''' import urllib2 url = "http://blog.csdn.net/FansUnion" #定制自定义Header,模拟浏览器向服务器提交请求 req = urllib2.Request(url) req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/39.0.2171.95 Safari/537.36') req.add_header('Host','blog.csdn.net') req.add_header('Referer','http://blog.csdn.net') req.add_header('GET',url) #下载网页html并打印 html = urllib2.urlopen(req) content = html.read() print content html.close() 呵呵,你限制我,我就跳过你的限制.据说只要浏览器能够访问的,就能够通过爬虫抓取. 2.对代码进行一些优化 #input: help(urllib2.Request) #output(因篇幅关系,只取__init__方法) __init__(self,url,data=None,headers={},origin_req_host=None,unverifiable=False) 通过观察,我们发现headers={},就是说可以以字典的方式提交header信息.那就动手试试咯!! #只取自定义Header部分代码 csdn_headers = { "User-Agent": "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/39.0.2171.95 Safari/537.36","Host": "blog.csdn.net",'Referer': 'http://blog.csdn.net',"GET": url } req = urllib2.Request(url,headers=csdn_headers) 发现是不是很简单,在这里感谢斯巴达的无私赐教. 提供动态头部信息 ''' @本程序是用来动态提交Header信息 @random 动态库,详情请参考<https://docs.python.org/2/library/random.html> ''' # coding=utf-8 import urllib2 import random url = 'http://www.lifevc.com/' my_headers = [ 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648)','Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; InfoPath.1','Mozilla/4.0 (compatible; GoogleToolbar 5.0.2124.2070; Windows 6.0; MSIE 8.0.6001.18241)','Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)','Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; Sleipnir/2.9.8)',#因篇幅关系,此处省略N条 ] random_header = random.choice(headers) # 可以通过print random_header查看提交的header信息 req = urllib2.Request(url) req.add_header("User-Agent",random_header) req.add_header('Host',url) content = urllib2.urlopen(req).read() print content 其实很简单,这样我们就完成了对代码的一些优化. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |