python库-urllib
urllib库提供了一系列操作url的功能,是python处理爬虫的入门级工具,网上的学习资料也很多。我做爬虫是一开始就用了Scrapy框架,并不是一步步从urllib开始的,反而是在后来解决一些小问题的时候用到了urllib库,感觉用起来很简洁也很实用,下面是我最近的一些应用总结。
1、urllib和urllib2
在python2.x的版本中有urllib和urllib2两个库,为什么这样我也没有好好去调研。两者能处理的问题有些相交,更多的是不同,在我的应用场景中,一个最重要的区别就是通过urllib2的方法可以修改header信息,而urllib不支持,后边的例子可以看到。
在python3的版本中,已经没有urllib2了,版本2中的urllib和urllib2合并在了一起,urllib自然也就支持修改头部信息
下面这两段代码是python2和python3的使用情况对比
1 import urllib2 2 req=urllib2.Request('https://www.python.org/') 3 req.add_header('Range','bytes=0-20') 4 res=urllib2.urlopen(req) 5 data=res.read().decode('utf-8') 6 print data
1 python3: 2 from urllib import request 3 req=request.Request("https://www.python.org/")
4 req.add_header('Range','bytes=0-20')
5 res=request.urlopen(req) 6 res.read().decode('utf-8')
2、应用urllib爬取页面信息的完整小案例(python2)
我理解的整个爬虫的过程就是首先下载网页,然后对网页进行解析提取需要的数据,最后数据入库或者是文件等等。上面的代码已经将网页下载下来了,只不过由于修改了Range信息,所以只下载了网页的一部分。
下面的例子就是如何解析网页,我之前关于Scrapy的博客用到了Xpath的方式,下面这个例子是用的正则,其实解析网页就没有urllib什么事了...
豆瓣电影中排名前170名电影的得分之和:我用的urllib库,用urllib2也是可以的
import urllib import re ll=[] for i in range(7): url='http://movie.douban.com/top250?start'+str(i*25) req=urllib.urlopen(url) page=req.read() reg='<span class="rating_num" property="v:average">([0-9]+.[0-9]+)</span>' regc=re.compile(reg) res=regc.findall(page) ll.extend(res) sum=0 for i in range(170): sum+=float(ll[i]) print sum
3、应用urllib2发送get和post请求(python2)
get和post最简单的理解就是,get是把请求信息附加到url里,而post则是通过表单
(1)查看请求参数——看url,可以从网址栏看,也可以通过开发者工具看
或者从,参数列表看:
(2)get方式----把参数附加到url即可
1 import urllib2 2 url='http://www.douban.com/search?source=suggest&q=123' 3 req=urllib2.Request(url)
(3)post方式
1 import urllib 2 import urllib2 3 url="http://www.douban.com/search" 4 data={'source':'suggest','q':'123'} 5 data=urllib.urlencode(data) # 编码成url的格式 6 req=urllib2.Request(url=url,data=data)
4、爬虫真的很好玩~~
最后再说点有意思的,本人也是有喜欢的小明星哒,网上那么多的美图下也下不过来,肿么办呢?写个爬虫吧哈哈~前几天逛贴吧看美图突发奇想写个小爬虫,追星学习两不误呢~
import re import urllib def getHtml(url): page = urllib.urlopen(url) html = page.read() return html def getImg(html): reg = r'src="(.+?\.jpg)" pic_ext' imgre = re.compile(reg) imglist = imgre.findall(html) x = 0 for imgurl in imglist: urllib.urlretrieve(imgurl,'%s.jpg' % x) x = x + 1 html = getHtml("http://tieba.baidu.com/p/..........?pn=1") #改一下参数 getImg(html)