当前位置: 首页 > news >正文

Python网络爬虫与信息提取(二):网络爬虫之规则(Requests库 Robots规则)

在python中有两种方式可以发送http请求

    ①通过python自带的urllib模块,不需要安装,直接from urllib import request,直接使用request对象做Http请求的发送。

    ②通过第三方的requests模块,需要pip install安装(推荐,因为API人性化)

Requests设置请求头Headers

为什么要设置headers? 

       在请求网页爬取的时候,输出的text信息中会出现抱歉,无法访问等字眼,这就是禁止爬取,需要通过反爬机制去解决这个问题。

      headers是解决requests请求反爬的方法之一,相当于我们进去这个网页的服务器本身,假装自己本身在爬取数据。对反爬虫网页,可以设置一些headers信息,模拟成浏览器取访问网站 。

headers在哪里找? 

F12,network,docs,Requests Headers

Requests库的7个主要方法

Requests库的get()方法

获得一个网页最简单的一行代码就是 r = requests.get(url)

Requests库支持6种常用的连接异常

raise_for_status() 方法

    response这样一个对象返回了所有的网页内容,它也提供了一个方法:raise_for_status(),这个方法是专门与异常打交道的,能判断返回的responce类型r,是不是200。是200就表示返回的内容是正确的;不是200就会产生一个HTTPError的异常

爬取网页的通用代码框架

import requests

def getHTMLText(url):
    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status() #如果状态不是200,引发HTTPError异常
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return '产生异常'


if __name__ == '__main__':
    url = "http://www.baidu.com"
    print(getHTMLText(url))

HTTP协议对资源的操作


这六个方法就是requests库提供的6个主要函数所对应的功能

HTTP协议通过这6个常用的方法对资源进行管理

Requests库主要方法解析(重点掌握head和get两个方法)

request方法

Requests的eequest方法是所有方法的基础方法

requests.request(method,url,**kwargs)

        method(7个):请求方法,对应get/put/post等7种

        url:拟获取页面的url链接

        **kwargs(13个):控制访问的参数,共13个

前6种都介绍过,option是向服务器获取一些服务器和客户端能够打交道的参数,平时用的较少

------------------------------------------------------------

可以模拟任何我们想模拟的浏览器,向服务器发起访问。模拟浏览器的方法就是在headers字段中实现

cookies和auth字段都是requests库的高级字段

可以有效地隐藏用户爬取网页的源IP地址信息,能够有效地防止对爬虫的逆追踪

都对应了一些高级功能

get方法(所以方法中最常用的方法)

**kwargs和params与request方法一样

head方法

**kwargs与request方法一样

post方法

put方法

patch方法

delete方法

为什么这些方法的**kwargs会有不同呢?

      在使用后6个方法的时候,由于这些方法会常用到某些访问控制参数,所以就把这些参数作为一个显式定义的参数量放到了函数的设计里面,而那些不很常用的参数就放到了访问控制可选的参数里面

网络爬虫的尺寸

网络爬虫带来的问题

骚扰问题

          对于一个网站来讲,网络爬虫就像骚扰电话一样,可以对这个网站带来很致命的骚扰功能

网络爬虫的法律风险

        服务器上的数据有产权归属

        网络爬虫获取数据后牟利将带来法律风险

        曾经有法院判处网络爬虫赔偿服务器网站巨额费用

网络爬虫泄露隐私

         网络爬虫可能具备突破简单访问控制的能力,获得被保护数据从而泄露个人隐私


网络爬虫的限制

       在实际的使用中一些较大的网站都对网络爬虫有相关的限制。在整个Internet上,也将网络爬虫作为一个可规范的功能来看待

对于一般的服务器来讲,可以用2种方式限制网络爬虫:来源审查和发布公告

来源审查 

        如果服务器/网站的所有者有一定的技术能力,可以通过来源审查来限制网络爬虫

       在进行浏览器访问的时候,不论是浏览器还是访问的软件,都会把它自己设定一个标识,放在User-Agent里。对网站服务器,它判断你HTT[的协议头,如果的User-Agent字段,不是预定的浏览器,那很可能就是一个爬虫 

发布公告

       像一个告示牌,告诉所有的爬虫,网站上哪部分内容你可以爬取,那部分你不可以爬取。

       但是是否遵守就要由网络爬虫自身来决定了


Robots协议

       robots协议一定是放在网站的根目录下,并不是所有的网站都有robots协议(如教育部的网站),没有robots协议的网站默认允许所有爬虫无限制地爬取其页面内容

Robots协议的遵守方式

Requests库网络爬虫实战

①京东页面商品的爬取

爬取页面:【华为荣耀8】荣耀8 4GB+64GB 全网通4G手机 魅海蓝【行情 报价 价格 评测】-京东     (一款手机)

状态码是200,说明返回的信息正确,并且获得了这个链接相应的内容

编码是gdk,说明从http的头部分已经可以解析出这个页面的编码信息,说明京东的网站提供了页面信息的相关编码。

import requests
url = 'https://item.jd.com/2967929.html'
try:
	r = requests.get(url)
	r.raise_for_status()
	r.encoding = r.apparent_encoding
	print(r.text[:1000])
except:
	print('爬取失败')

raise_for_status()函数在返回的代码如果是200的情况下是不产生异常的,否则会产生异常。

捕捉异常可以使用try/except语句。

  • try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。
  • 如果你不想在异常发生时结束你的程序,只需在try里捕获它。

②亚马逊商品页面的爬取

爬取页面:Amazon.cn

③百度/360搜素关键词提交

程序向百度/360这两个搜索引擎自动提交关键词并且获得它的搜索结果——python的request库

百度搜索全代码

import requests
keyword = 'Python'
try:
    kv = {'wd': keyword}
    r = requests.get('http://www.badu.com/s', params=kv)
    print(r.request.url)
    r.raise_for_status()
    print(len(r.text))
except:
    print('爬取失败')

360搜索全代码

import requests
keyword = 'Python'
try:
    kv = {'q': keyword}
    r = requests.get('http://www.so.com/s', params=kv)
    print(r.request.url)
    r.raise_for_status()
    print(len(r.text))
except:
    print('爬取失败')

④网络图片的爬取和存储

把我们看到的好看的网络图片存储下来

打开了一个文件,并且把它定义了一个文件标识符f,然后将返回的内容写回到这个文件中
r.content表示返回内容的二进制形式
f.write是写入到文件中

获取图片的时候用图片原来的名字存取在本地

import requests
import os
url = 'http://image.nationalgeographic.com.cn/2017/0211/20170211061910157.jpg'
root = 'D://pics//'
path = root + url.split('/')[-1]
try:
	if not os.path.exists(root):
		os.mkdir(root)
	if not os.path.exists(path):
		r = requests.get(url)
		with open(path,'wb') as f:
			f.write(r.content)
			f.close()
			print('文件保存成功')
	else:
		print('文件已存在')
except:
	print('爬取失败')

⑤IP地址归属地的自动查询

一个IP地址是来自于北京、上海还是美国呢

import requests
url = 'http://m.ip138.com/ip.asp?ip='
try:
    r = requests.get(url + '202.204.80.112')
    r.raise_for_status()
    r.encoding = r.apparent_encoding
    print(r.text[-500:])
except:
    print('爬取失败')

相关文章:

  • Windows防火墙添加禁用规则——以禁用微信为例
  • IA-32处理器与8086 实模式,保护模式和虚拟8086模式
  • C语言:main函数的命令行传参
  • ini文件和inf文件的区别
  • Windows系统常见的文件系统格式(FAT, NTFS, ExFAT)
  • 字符串编码(ASCII, GBK, ANSI, Unicode(‘\u‘), UTF-8编码)
  • Python网络爬虫与信息提取(三):网络爬虫之提取(Beautifulsoup bs4)
  • 查看win10系统日志
  • Windows安全模板配置
  • Python网络爬虫与信息提取(四):网络爬虫之实战(淘宝商品比价 股票数据)
  • Python—Scrapy爬虫框架
  • 大数据技术原理与应用(一):大数据概述
  • 大数据技术原理与应用(二):大数据处理架构Hadoop
  • 大数据技术原理与应用(三):分布式文件系统HDFS
  • Ubuntu18.04安装 Codeblocks
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 【前端学习】-粗谈选择器
  • Django 博客开发教程 16 - 统计文章阅读量
  • iOS | NSProxy
  • js继承的实现方法
  • Python学习之路13-记分
  • Redis字符串类型内部编码剖析
  • Spark RDD学习: aggregate函数
  • Vue.js源码(2):初探List Rendering
  • webpack+react项目初体验——记录我的webpack环境配置
  • 关于List、List?、ListObject的区别
  • 回流、重绘及其优化
  • 技术发展面试
  • 普通函数和构造函数的区别
  • 如何利用MongoDB打造TOP榜小程序
  • 使用Gradle第一次构建Java程序
  • ​iOS实时查看App运行日志
  • !$boo在php中什么意思,php前戏
  • #Spring-boot高级
  • #考研#计算机文化知识1(局域网及网络互联)
  • #控制台大学课堂点名问题_课堂随机点名
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (2)Java 简介
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (JS基础)String 类型
  • (Ruby)Ubuntu12.04安装Rails环境
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (论文阅读11/100)Fast R-CNN
  • (实战篇)如何缓存数据
  • (四)汇编语言——简单程序
  • (转)http-server应用
  • (转)ObjectiveC 深浅拷贝学习
  • (转)Unity3DUnity3D在android下调试
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .gitignore文件—git忽略文件
  • .NET 中的轻量级线程安全
  • .netcore 获取appsettings
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .NET上SQLite的连接
  • @NestedConfigurationProperty 注解用法