爬虫学习一
什么是网络爬虫:
通俗理解: 爬虫是一个模拟人类请求网站行为的程序,可以自动请求网页、并数据抓取下来,然后使用一定的规则提取有价值的数据。
通用爬虫和聚焦爬虫:
1.通用爬虫:通用爬虫是搜索引擎抓取系统(百度、谷歌、搜狗等)的重要组成部分,主要试讲互联网上的网页下载到本地,形成一个互联网内容的备份。
2.聚焦爬虫: 是面向特定需求的一种网络爬虫程序,他与 爬虫的区别在与;聚焦爬虫在实施网页抓取的时候对内容进行筛选和处理,尽量保证只抓取雨需求相关的网页信息、
urllib库
Urllib是python内置的HTTP请求库
包括以下模块
urllib.request 请求模块
urllib.error 异常处理模块
urllib.parse url解析模块
urllib.robotparser robots.txt解析模块
urlopen函数:
在Python3 的 urllib库中,所有和网络请求相关的方法,都被聚到 urllib.request 模块下面,来看下urlopen 函数的用法:
import urllib.request response = urllib.request.urlopen('http://www.baidu.com') print(response.read().decode('utf-8'))
print(response.getcode())#请求的状态码
urlopen后面跟的参数:
urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
*, cafile=None, capath=None, cadefault=False, context=None):
常用的有(url: 请求的url
data:请求的 data ,如果设置这个值,那么僵变成 POST请求
timeout:在某些网络情况不好或者服务器端异常的情况会出现请求慢的情况,或者请求异常,所以这个时候我们需要给
请求设置一个超时时间,而不是让程序一直在等待结果。
)
urlretrieve函数:
这个函数可以方便将网页上的一个文件保存在本地,也可以下载图片等。
1 from urllib import request 2 3 4 request.urlretrieve('https://gss0.bdstatic.com/94o3dSag_xI4khGkpoWK1HF6hhy/baike/w%3D268%3Bg%3D0/sign=50e7ccb8573d26972ed30f5b6dc0d5c6/241f95cad1c8a786391cbb7c6109c93d70cf508a.jpg', '鲁班.jpg')
urlencode函数:
用浏览器发请求的时候,如果rul中含有中文或者其他特殊字符,那么浏览器会自动给我们进行编码,如果使用代码发请求,那么就要手动的进行编码,这是就要用到urlencode 函数来实现
from urllib import parse #编码导入parse模块 data = {'name': '张三', 'age': 18, 'greet': 'Hello world'} result = parse.urlencode(data) print(result)
结果:
name=%E5%BC%A0%E4%B8%89&age=18&greet=Hello+world
url = 'http://www.baidu.com/s'
parses = {"wd": '刘德华'}
qs = parse.urlencode(parses)
url = url +'?'+ qs
resp = request.urlopen(url)
print(resp.readlines())
parse_qs函数:
可以将经过编码后的url参数进行解码。
data = {'name': '张三', 'age': 18, 'greet': 'Hello world'} result = parse.urlencode(data) #编码 print(result) qs = parse.parse_qs(result) #解码 print(qs) 结果: name=%E5%BC%A0%E4%B8%89&age=18&greet=Hello+world {'name': ['张三'], 'age': ['18'], 'greet': ['Hello world']}
urlparse和urlsplit函数:
有时候拿到一个 url ,想要读这个url 中的各个组成部分进行分割,那么这个时候我们可以使用 urlparse 或者是urlsplit 来进行分割,urlsplit 没有params 如下:
from urllib import parse, request url = 'https://www.baidu.com/baidu?tn=monline_3_dg&ie=utf-8&wd=Python3#1' result = parse.urlparse(url) print(result) print('scheme:', result.scheme) print('netloc:', result.netloc) print('path:', result.path) print('query:', result.query) print('fragment:', result.fragment) 结果: ParseResult(scheme='https', netloc='www.baidu.com', path='/baidu', params='', query='tn=monline_3_dg&ie=utf-8&wd=Python3', fragment='1') scheme: https netloc: www.baidu.com path: /baidu query: tn=monline_3_dg&ie=utf-8&wd=Python3 fragment: 1
request.Reques类:
如果想要在请求时候增加一些请求头,那么必须使用request.Request 类来实现。 比如增加一个User+Agen,如下:
爬取拉钩网的招聘信息:
from urllib import request, parse url = 'https://www.lagou.com/jobs/4500619.html' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36', 'Referer': 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=', } data = { 'first': 'true', 'pn': 1, 'kd': 'python' } ret = request.Request(url, headers=headers, data=parse.urlencode(data).encode('utf-8'), method="POST") reps = request.urlopen(ret) print(reps.read().decode('utf-8'))
ProxyHandler 处理器(代理设置):
很多网站检测某一段时间某个IP的访问次数(通过流量统计,系统日志等),如果访问次数多的不像正常人,它会禁止这个IP的访问,所以我们可以设置一些代理服务器,每隔一段时间换一个代理,就算IP被禁止,依然可以换个IP继续爬取。
常用的代理有:
西刺免费代理IP:http://www.xicidaili.com/
快代理:http://www.kuaidaili.com/
代理云:http://www.dailiyun.com/
ProxyHandler处理器
1. 代理的原理: 在请求目的网站之前,先请求代理服务器,然后代理服务器去请求目的网站, 代理服务器拿到目的网站的数据后,在转发我们代码。
2.http://httpbin.org: 这个网站可以方便的查看http请求的一下参数。
3.在代码中使用代理:
- 使用 ' urllib.request.ProxyHandler',传入一个代理,这个代理是一个字典,字典的key依赖代理服务器能够接受的类型,一般是‘http’ 或者 ‘ https’, 值是 ‘IP:port ’。
- 使用上一步骤创建的 'handler ’, 以及 ‘request.build_opener’ 创建一个 ‘opener’对象。
- 使用上一步创建的 ‘opener’, 调用 ‘open’ 函数,发起请求。
4.代码如下:
1 from urllib import request 2 3 # 没有用代理的 4 url = 'http://httpbin.org/ip' 5 reps = request.urlopen(url) 6 print(reps.read()) 7 结果: 8 b'{\n "origin": "111.203.45.2, 111.203.45.2"\n}\n' 9 10 # 使用代理 11 url = 'http://httpbin.org/ip' 12 # 1. 使用 ProxyHandler 传入代理构建一个Handler 13 handler = request.ProxyHandler({"http": "121.232.148.162:9000"}) 14 # 2. 使用上面的创建一个opener 15 opener = request.build_opener(handler) 16 # 3. 使用opener发送一个请求 17 resp = opener.open(url) 18 print(resp.read().decode('utf-8')) 19 结果: 20 { 21 "origin": "121.232.148.162, 121.232.148.162" 22 }
********************后续查看爬虫学习二************************