004 爬虫(最初的爬虫方式,以及urllib2)

一:最初的爬取方式

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.效果展示

  

原文地址:https://www.cnblogs.com/juncaoit/p/7565681.html