一:最初的爬取方式
1.代码示例
1 # coding=utf-8 2 import urllib2 3 request=urllib2.Request("http://www.baidu.com") 4 response=urllib2.urlopen(request) 5 print response.read()
2.request对象概念
python中的request其实就是python向服务器发出请求,得到其返回的信息。
3.urllib与urllib2
是功能强大的网络编程函数库,通过他们在网络上访问文件就像访问本地电脑上的文件一样。
与re模块结合,可以下载web页面,提取信息,这时最开始的抓取方式。
4.常见的请求方式
get
post
put
delete
二:Post方式的爬取
1.程序(post方式)
1 #coding=utf-8 2 import urllib 3 import urllib2 4 values={"wd":"python爬虫"} 5 data=urllib.urlencode(values) 6 url="http://www.baidu.com/s" 7 request=urllib2.Request(url,data) 8 response=urllib2.urlopen(request) 9 print response.read()
三:Get方式的爬
1.是?链接的情况
2.程序
1 #encoding=utf-8 2 import urllib 3 import urllib2 4 values={} 5 values['wd']="python爬虫" 6 data=urllib.urlencode(values) 7 url="http://www.baidu.com/s" 8 getUrl=url+"?"+data 9 request=urllib2.Request(getUrl) 10 response=urllib2.urlopen(request) 11 print response.read()
四:Header设置
1.原有
有些网站不会同意直接访问,如果有识别问题,站点不会响应
因此,为了完全模拟浏览器上的工作,需要设置一些Header的属性。
2.设置
user agent='Mozilla/4.0(compatible;MSIE 5.5;Windows NT)'
headers={'User-Agent':user agent}
request=urllib2.Request(url,data,headers)
五:使用代理访问
1.缘由
多次访问,目标网站会禁止你的访问,所以需要更换IP
2.免费的代理ip网站
http://www.xicidaili.com/
六:对上面知识点程序演示
1.爬虫
1 #encoding=utf-8 2 import urllib 3 import urllib2 4 import random 5 ##获取html的功能函数 6 def get_html(url,headers,proxies,num_retries=2): 7 print 'Download:',url 8 req=urllib2.Request(url) 9 10 ##设置请求头 11 req.add_header('User-Agent',random.choice(headers['User-Agent'])) 12 13 ##设置代理 14 proxy_support=urllib2.ProxyHandler({'http':random.choice(proxies)}) 15 opener=urllib2.build_opener(proxy_support); 16 urllib2.install_opener(opener) 17 18 html=urllib2.urlopen(req).read() 19 return html 20 ##主流程代码 21 headers={ 22 "User-Agent":["Mozilla/5.0(Windows NT 10.0;WOW64;rv:50.0) Gecko/20100101 Firefox/50.0"] 23 } 24 proxies=["61.135.217.7:80","114.247.209.130:8080"] 25 html=get_html("https://www.tmall.com",headers,proxies) 26 print html
七:异常处理
1.URLError
产生的原因如下:
网络无连接,链接不到指定的服务器,服务器不存在。
2.解决方式
使用try except
程序示例如下:
1 import urllib2 2 request=urllib2.Request("www.12334rer.com") 3 try: 4 response=urllib2.urlopen(request) 5 except urllib2.URLError,e: 6 print e.reason 7 print 1
3.HttpError
是URLError的子类,在利用urlopen方法发出一个请求后,服务器都会对应一个应答对象response,其中它包含一个数字“状态吗”,表示Http协议所返回的响应的状态。
注意点:except的顺序。
程序示例如下:
1 #-*- coding: UTF-8 -*- 2 import urllib2 3 req = urllib2.Request('http://blog.csdn.net/cqcre1') 4 try: 5 urllib2.urlopen(req) 6 except urllib2.HTTPError,e: 7 print e.code 8 except urllib2.URLError, e: 9 print e.reason 10 else: 11 print "OK"
显示403,表示禁止访问。
八:正则表达式
1.Re模块
自带的re模块,提供正则表达式的支持。
主要用到的方法:
#返回pattern对象
re.compile(string,[,flag])
#匹配所用的函数
re.match(pattern,string[,flag])
re.search(pattern,string[,flag])
re.split(pattern,string[,maxsplit])
re.findall(pattern,string[,flag])
2.pattern的创建
pattern=re,compile(r'hello')
3.flag参数
flag是匹配模式
可以使用‘|’进行同时生效。
re.I:表示忽略大小写
re.M:多行模式
4.程序示例
1 #-*- coding: UTF-8 -*- 2 # 导入re模块 3 import re 4 5 # 将正则表达式编译成Pattern对象,注意hello前面的r的意思是“原生字符串” 6 pattern = re.compile(r'hello') 7 8 # 使用re.match匹配文本,获得匹配结果,无法匹配时将返回None 9 result1 = re.match(pattern, 'a12') 10 result2 = re.match(pattern, 'helloo CQC!') 11 result3 = re.match(pattern, 'helo123 CQC!') 12 result4 = re.match(pattern, 'hello CQC!') 13 # 如果1匹配成功 14 if result1: 15 # 使用Match获得分组信息 16 print result1.group() 17 else: 18 print '1匹配失败!' 19 20 # 如果2匹配成功 21 if result2: 22 # 使用Match获得分组信息 23 print result2.group() 24 else: 25 print '2匹配失败!' 26 27 # 如果3匹配成功 28 if result3: 29 # 使用Match获得分组信息 30 print result3.group() 31 else: 32 print '3匹配失败!' 33 34 # 如果4匹配成功 35 if result4: 36 # 使用Match获得分组信息 37 print result4.group() 38 else: 39 print '4匹配失败!'
5.正则表达式的语法
主要是那些模糊查找。
6.程序示例代码
1 #-*- coding: UTF-8 -*- 2 import urllib 3 import urllib2 4 import random 5 import re 6 import sys 7 8 ##设置编码 9 reload(sys) 10 sys.setdefaultencoding('utf-8') 11 12 def get_html(url,headers,proxies,num_retries=2): 13 print 'Downloading:',url 14 #设置请求头,模拟浏览器访问 15 req=urllib2.Request(url) 16 req.add_header("User-Agent",random.choice(headers['User-Agent'])) 17 #设置代理 18 proxy_support=urllib2.ProxyHandler({'http':random.choice(proxies)}) 19 opener=urllib2.build_opener(proxy_support) 20 urllib2.install_opener(opener) 21 html=urllib2.urlopen(req).read() 22 return html 23 headers={ 24 "User-Agent":["Mozilla/5.0(Windows NT 10.0;WOW64;rv:50.0) Gecko/20100101 Firefox/50.0"] 25 } 26 proxies=["121.31.101.107:8123","113.58.235.60:808"] 27 html=get_html("https://www.tmall.com",headers,proxies) 28 # print html 29 links=re.findall("<a href="(.+?)">(.+?)</a>",html) 30 for link in links: 31 print link[0] 32 print link[1].encode("utf-8")
7.效果
8.将数据存储到Excel表格
前提:
9.程序示例
1 #-*- coding: UTF-8 -*- 2 import urllib 3 import urllib2 4 import random 5 import re 6 import sys 7 8 import xlwt 9 reload(sys) 10 sys.setdefaultencoding('utf-8') 11 def get_html(url,headers,proxies,num_retries=2): 12 print 'Downloading:',url 13 #设置请求头,模拟浏览器访问 14 req=urllib2.Request(url) 15 req.add_header("User-Agent",random.choice(headers['User-Agent'])) 16 #设置代理 17 proxy_support=urllib2.ProxyHandler({'http':random.choice(proxies)}) 18 opener=urllib2.build_opener(proxy_support) 19 urllib2.install_opener(opener) 20 html=urllib2.urlopen(req).read() 21 return html 22 23 def saveData(datalist, savepath): 24 book = xlwt.Workbook(encoding='utf-8', style_compression=0) 25 sheet = book.add_sheet('天猫首页链接信息', cell_overwrite_ok=True) 26 col = (u'编号', u'内容', u'链接') 27 for i in range(0, 3): 28 sheet.write(0, i, col[i]) # 列名 第一个参数表示第几行 第二个参数表示第几列 第三个参数表示内容 29 i=0 30 print len(datalist) 31 for link in datalist: 32 i=i+1 33 sheet.write(i, 0, i) # 数据 写编号 34 for j in range(1,3): 35 sheet.write(i,j, link[j-1].encode("utf-8")) # 数据 36 book.save(savepath) # 保存 37 38 headers={ 39 "User-Agent":["Mozilla/5.0(Windows NT 10.0;WOW64;rv:50.0) Gecko/20100101 Firefox/50.0"] 40 } 41 proxies=["121.31.101.107:8123","113.58.235.60:808"] 42 html=get_html("https://www.tmall.com",headers,proxies) 43 # print html 44 links=re.findall("<a href="(.+?)">(.+?" 45 ")</a>",html) 46 for link in links: 47 print link[0],link[1].encode("utf-8") 48 saveData(links,'TmallLink.xls')
10.效果展示