网页抓取就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地。
在Python中,可以使用urllib2这个模块来抓取网页,模块提供了读取web页面数据的接口,我们可以像读取本地文件一样读取www和ftp上的数据.
HTTP是基于请求和应答机制的:客户端提出请求,服务端提供应答。
以下实现了最简单的urllib2抓取网页。
1.获取整个页面数据
#!/usr/bin/env python
import urllib2
def GetHtml(url):
response = urllib2.urlopen(url)
HtmlPage = response.read()
return HtmlPage
print GetHtml('http://www.baidu.com')
#!/usr/bin/env python
import urllib2
def GetHtml(url):
req = urllib2.Request(url)
response = urllib2.urlopen(req)
HtmlPage = response.read()
return HtmlPage
print GetHtml('http://www.baidu.com')
以上两种形式一样。
urllib2用一个Request对象来映射提出的HTTP请求,将请求的地址创建一个Request对象,
通过调用urlopen并传入Request对象,响应后将返回response文件对象,再调用read()函数读取抓取的网页内容。
2.获取页面中特定的数据
这个首先需要了了解一些正则表达式的知识,http://blog.csdn.net/seven_five577/article/details/48622185
http://blog.csdn.net/seven_five577/article/details/48469751
假设我想要获取这一网页点击打开链接的所有小黄人的图片
点击某一图片的审查元素找到图片的地址
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib
import re
def GetHtml(url):
response = urllib.urlopen(url)
HtmlPage = response.read()
return HtmlPage
def GetImg( HtmlPage):
Img=re.compile(r'src="(.+?\.img)" ')
ImgList = re.findall(Img,HtmlPage)
count = 1
for ImgURL in ImgList:
urllib.urlretrieve(ImgURL,'%s.img' % count)
count+=1
HtmlPage = GetHtml(<span style="font-size:14px;">'http://www.3lian.com/gif/2014/09-17/60992.html</span>')
print GetImg(HtmlPage)
urllib.urlretrieve()
方法,直接将远程数据下载到本地。(注: urllib2没有urlretrieve这个方法)
通过一个for循环对获取的每个图片的连接进行遍历,保存的位置默认为程序的存放目录。
修改上面的程序添加循环可以爬多张网页的图。
# -*- coding: utf-8 -*-
import urllib
import re
def GetHtml(url):
i=1
count = 1
for i in range(1,5):
URL = url + str(i)
response = urllib.urlopen(URL)
HtmlPage = response.read()
Img=re.compile(r'src="(.+?\.jpg)" ')
ImgList = re.findall(Img,HtmlPage)
for ImgURL in ImgList:
urllib.urlretrieve(ImgURL,'%s.jpg' % count)
count+=1
print GetHtml ('https://mm.taobao.com/json/request_top_list.htm?type=0&page=')
若urllib.urlretrieve('http:' +ImgURL,'%s.jpg' % count) 变成urllib.urlretrieve(ImgURL,'%s.jpg' % count)
则会出现以下错误,但是爬单张网页不会出错。
以上代码可稍微改变一点 实现任意页面的图片抓取。
# -*- coding: utf-8 -*-
import urllib
import re
def GetHtml(url,start_page,end_page):
count = 1
for i in range(start_page,end_page):
URL = url + str(i)
response = urllib.urlopen(URL)
HtmlPage = response.read()
Img=re.compile(r'src="(.+?\.jpg)" ')
ImgList = re.findall(Img,HtmlPage)
for ImgURL in ImgList:
urllib.urlretrieve('http:' +ImgURL,'%s.jpg' % count)
count+=1
start_page = int(raw_input(u'please input the start_page:\n'))
end_page = int (raw_input(u'please input the end_page:\n'))
print GetHtml ('https://mm.taobao.com/json/request_top_list.htm?type=0&page=',start_page,end_page)