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

      

  • 相关阅读:
    五分钟学编程:如何学好数据结构与算法?
    假如有人把支付宝的服务器炸了, 存在支付宝里的钱是不是没了?
    腾讯辞退60多人!10余人被移送公安机关
    uniGUI之TUniHiddenPanel(14)
    uniGUI之FirDAC(13)
    uniGUI之MainModule(12)
    uniGUI 应用程序体系结构(11)
    UniGUI之Login窗口(10)
    ActiveMQ面试专题
    Redis面试专题
  • 原文地址:https://www.cnblogs.com/juncaoit/p/7565681.html
Copyright © 2020-2023  润新知