爬虫概念:按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
通俗的来说就是:就是爬虫可以模拟浏览器的行为做你想做的事,订制化自己搜索和下载的内容,并实现自动化的操作。
爬虫实现: 实现爬虫技术的编程环境有很多种,Java,Python,C++等都可以用来爬虫
爬虫学习知识点:
1、首先学会基本的Python语法知识
2、学习Python爬虫常用到的几个重要内置库urllib, http等,用于下载网页
3、学习正则表达式re、BeautifulSoup(bs4)、Xpath(lxml)等网页解析工具
4、开始一些简单的网站爬取(博主从百度开始的,哈哈),了解爬取数据过程
5、了解爬虫的一些反爬机制,header,robot,时间间隔,代理ip,隐含字段等
6、学习一些特殊网站的爬取,解决登录、Cookie、动态网页等问题
7、了解爬虫与数据库的结合,如何将爬取数据进行储存
8、学习应用Python的多线程、多进程进行爬取,提高爬虫效率
9、学习爬虫的框架,Scrapy、PySpider等
10、学习分布式爬虫(数据量庞大的需求)
一个请求过程:在浏览器输入网址搜索后----->DNS服务器进行域名解析----->找到对应服务器并通过GET或POST方法请求数据----->
- ---->若请求成功,我们就得到了我们想看到的网页----->
---->若请求不成功,服务器会返回给我们请求失败的状态码,常见到的503,403等。
爬虫的原理就是模拟这样一个操作
python请求:urllib库:向服务器发出请求并获得网页的功能
Python2.x中使用的urllib2和urllib库,而Python3.x中合并成一个唯一的urllib库。
python属性:error,parse,request,response。
1、Error:“Exception classesraised by urllib.”----就是由urllib举出的exception类
2、Parse:“Parse (absolute andrelative) URLs.”----解析绝对和相对的URLs
3、Request:“An extensiblelibrary for opening URLs using a variety of protocols”
----用各种协议打开URLs的一个扩展库
4、Response:“Response classesused by urllib.”----被urllib使用的response类
一个简单例子:获取python网页
import urllib.request response = urllib.request.urlopen(‘http://python.org/‘) result = response.read().decode(‘utf-8‘) print(result)
其中urlopen方法
def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TI MEOUT,*, cafile=None, capath=None, cadefault=False, context=None):
参数介绍:
url:即是我们输入的url网址,(如:http://www.xxxx.com/);
data: 是我们要发给服务器请求的额外信息(比如登录网页需要主动填写的用户信息)。如果需要添加data参数,
那么是POST请求,默认无data参数时,就是GET请求;
一般来讲,data参数只有在http协议下请求才有意义
data参数被规定为byte object,也就是字节对象
data参数应该使用标准的结构,这个需要使用urllib.parse.urlencode()将data进行 转换,
而一般我们把data设置成字典格式再进行转换即可;data在以后实战中会介绍如何使用
timeout:是选填的内容,定义超时时间,单位是秒,防止请求时间过长,不填就是默认的时间;
cafile:是指向单独文件的,包含了一系列的CA认证 (很少使用,默认即可);
capath:是指向文档目标,也是用于CA认证(很少使用,默认即可);
cafile:可以忽略
context:设置SSL加密传输(很少使用,默认即可);
打开链接后其他操作:
geturl(): 返回URL,用于看是否有重定向。 result = response.geturl() 结果: https://www.python.org/
info():返回元信息,例如HTTP的headers。 result = response.info() 结果: x-xss-protection: 1; mode=block X-Clacks-Overhead: GNU Terry Pratchett ... Vary: Cookie Strict-Transport-Security: max-age=63072000;includeSubDomains
getcode():返回回复的HTTP状态码,成功是200,失败可能是503等,可以用来检查代理IP的可使用性。 result = response.getcode() 结果:200
Request方法 class Request: def __init__(self, url, data=None, headers={},origin_req_host=None, unverifiable=False,method=None):
参数介绍:
url,data和上面urlopen中的提到的一样。
headers是HTTP请求的报文信息,如User_Agent参数等,它可以让爬虫伪装成浏览器而不被服务器发现你正在使用爬虫。
origin_reg_host, unverifiable, method等不太常用
headers很有用,有些网站设有反爬虫机制,检查请求若没有headers就会报错,
因此为保证爬虫的稳定性,基本每次都会将headers信息加入进去,这是反爬的简单策略之一
import urllib.request headers = {‘User_Agent‘: ‘‘} response = urllib.request.Request(‘http://python.org/‘, headers=headers) html = urllib.request.urlopen(response) result = html.read().decode(‘utf-8‘) print(result)
error的使用:error属性里面主要包括了两个重要的exception类,URLError类和HTTPError类。
1. URLError类 def __init__(self, reason, filename=None): self.args = reason, self.reason = reason if filename is not None: self.filename = filename URLError类是OSError的子类,继承OSError,没有自己的任何行为特点,但是将作为error里面所有其它类型的基类使用。 URLError类初始化定义了reason参数,意味着当使用URLError类的对象时,可以查看错误的reason。
2. HTTPErro类 def __init__(self, url, code, msg, hdrs, fp): self.code = code self.msg = msg self.hdrs = hdrs self.fp = fp self.filename = url HTTPError是URLError的子类,当HTTP发生错误将举出HTTPError。 HTTPError也是HTTP有效回应的实例,因为HTTP协议错误是有效的回应,包括状态码,headers和body。所以看到在HTTPError初始化的时候定义了这些有效回应的参数。 当使用HTTPError类的对象时,可以查看状态码,headers等
案例1: import urllib.request import urllib.error try: headers = {‘User_Agent‘: ‘Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0‘} response = urllib.request.Request(‘http://python.org/‘, headers=headers) html = urllib.request.urlopen(response) result = html.read().decode(‘utf-8‘) except urllib.error.URLError as e: if hasattr(e, ‘reason‘): print(‘错误原因是‘ + str(e.reason)) except urllib.error.HTTPError as e: if hasattr(e, ‘code‘): print(‘错误状态码是‘ + str(e.code)) else: print(‘请求成功通过。‘)
本文转载:https://segmentfault.com/a/1190000012681700
原文:https://www.cnblogs.com/1314520xh/p/14769702.html