爬虫-1.概述和HTTP请求与响应处理

爬虫-1.概述和HTTP请求与响应处理

概述

  • 爬虫,应该称为网络爬虫,也叫网页蜘蛛、网络机器人、网络蚂蚁等。
  • 搜索引擎,就是网络爬虫的应用者。
  • 大数据时代的到来,所有企业都希望通过海量数据发现其中的价值。所以需要爬取对特定网站、特顶类别的数据,而搜索引擎不能提供这样的功能,因此需要自己开发爬虫来解决。

爬虫分类

1.通用爬虫

常见就是搜索引擎,无差别的搜集数据、存储、提取关键字、构建索引库,给用户提供搜索接口。

  • 爬取一般流程
    1. 初始化一批URL,将这些URL放到带爬队列
    2. 从队列取出这些URL,通过DNS解析IP,对IP对应的站点下载HTML页面,保存到本地服务器中,爬取完的URL放到已爬取队列。
    3. 分析这些网页内容,找出网页里面的其他关心的URL链接,继续执行第2步,直到爬取条件结束。
  • 搜索引擎如何获取一个网站的URL
    1. 新网站主动提交给搜索引擎
    2. 通过其他网站页面中设置的外链接
    3. 搜索引擎和DNS服务商合作,获取最新收录的网站

2. 聚焦爬虫

  • 有针对性的编写特定领域数据的爬取程序,针对 某些类别数据采集的爬虫,是面向主题的爬虫

Robots协议

指定一个robots.txt文件,告诉爬虫引擎什么可以爬取

  • /表示网站根目录,表示网站所有目录。
  • Allow允许爬取的目录
  • Disallow禁止爬取的目录
  • 可以使用通配符

robots是一个君子协定,“爬亦有道”
这个协议为了让搜索引擎更有效率搜索自己内容,提供了Sitemap这样的文件。Sitemap往往是一个XML文件,提供了网站想让大家爬取的内容的更新信息。
这个文件禁止爬取的往往又是可能我们感兴趣的内容,反而泄露了这些地址。

  1. 示例:淘宝的robotshttp://www.taobao.com/robots.txt

    User-agent:  Baiduspider
    Allow:  /article
    Allow:  /oshtml
    Allow:  /ershou
    Allow: /$
    Disallow:  /product/
    Disallow:  /
    
    User-Agent:  Googlebot
    Allow:  /article
    Allow:  /oshtml
    Allow:  /product
    Allow:  /spu
    Allow:  /dianpu
    Allow:  /oversea
    Allow:  /list
    Allow:  /ershou
    Allow: /$
    Disallow:  /
    
    User-agent:  Bingbot
    Allow:  /article
    Allow:  /oshtml
    Allow:  /product
    Allow:  /spu
    Allow:  /dianpu
    Allow:  /oversea
    Allow:  /list
    Allow:  /ershou
    Allow: /$
    Disallow:  /
    
    User-Agent:  360Spider
    Allow:  /article
    Allow:  /oshtml
    Allow:  /ershou
    Disallow:  /
    
    User-Agent:  Yisouspider
    Allow:  /article
    Allow:  /oshtml
    Allow:  /ershou
    Disallow:  /
    
    User-Agent:  Sogouspider
    Allow:  /article
    Allow:  /oshtml
    Allow:  /product
    Allow:  /ershou
    Disallow:  /
    
    User-Agent:  Yahoo!  Slurp
    Allow:  /product
    Allow:  /spu
    Allow:  /dianpu
    Allow:  /oversea
    Allow:  /list
    Allow:  /ershou
    Allow: /$
    Disallow:  /
    
    User-Agent:  *
    Disallow:  /
    
  2. 示例马蜂窝tobotshttp://www.mafengwo.cn/robots.txt

    User-agent: *
    Disallow: /
    Disallow: /poi/detail.php
    
    Sitemap: http://www.mafengwo.cn/sitemapIndex.xml
    

HTTP请求和响应处理

其实爬取网页就是通过HTTP协议访问网页,不过通过浏览器反问往往是人的行为,把这种行为变成使用程序来访问。

urllib包

urllib是标准库,它一个工具包模块,包含下面模块来处理url:
* urllib.request 用于打开和读写url
* urllib.error 包含了由urllib.request引起的异常
* urllib.parse 用于解析url
* urllib.robotparser 分析robots.txt文件

Python2中提供了urllib和urllib2。urllib提供较为底层的接口,urllib2对urllib进行了进一步封装。Python3中将urllib合并到了urllib2中,并更名为标准库urllib包。

urllib.request模块

定义了在基本和摘要式身份验证、重定向、cookies等应用中打开Url(主要是HTTP)的函数和类。

  • urlopen方法

    1. urlopen(url,data=None)
      • url是链接地址字符串,或请求类的实例
      • data提交的数据,如果data为Non发起的GET请求,否则发起POST请求。见urllib.request.Request#get_method返回http.client.HTTPResponse类的相遇对象,这是一个类文件对象。
    from urllib.request import urlopen
    
    # 打开一个url返回一个相应对象,类文件对象
    # 下面链接访问后会有跳转
    responses = urlopen("http://www.bing.com") #默认GET方法
    print(responses.closed)
    with responses:
        print(1, type(responses)) # http.client.HTTPResponse类文件对象
        print(2,responses.status,responses.reason) #状态
        print(3,responses.geturl()) #返回真正的URL
        print(4,responses.info()) #headers
        print(5,responses.read()[:50]) #读取返回的内容
    
    print(responses.closed)
    

001
1. 上例,通过urllib.request.urlopen方法,发起一个HTTP的GET请求,WEB服务器返回了网页内容。响应的数据被封装到类文件对象中,可以通过read方法、readline方法、readlines方法获取数据,status和reason属性表示返回的状态码,info方法返回头信息,等等。

  • User-Agent问题

    1. 上例代码非常精简,即可以获得网站的响应数据。但目前urlopen方法通过url字符串和data发起HTTP的请求。如果想修改HTTP头,例如useragent,就的借助其他方式。

      • 原码中构造的useragen如下:
      # urllib.request.OpenerDirector
      class OpenerDirector:
          def __init__(self):
              client_version = "Python-urllib/%s" % __version__
              self.addheaders = [('User-agent', client_version)]
      ```
      * 当前显示为Python-urlib/3.7
      * 有些网站是反爬虫的,所以要把爬虫伪装成浏览器。顺便打开一个浏览器,复制李立群的UA值,用来伪装。
      
      
  • Request类
    Request(url,data=None,headers={})
    初始化方法,构造一个请求对象。可添加一个header的字典。data参数决定是GET还是POST请求。
    obj.add_header(key,val)为header增加一个键值对。

from urllib.request import Request,urlopen
import random

# 打开一个url返回一个Request请求对象
# url = "https://movie.douban.com/" #注意尾部的斜杠一定要有
url = "http://www.bing.com/"

ua_list 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值