python3网络爬虫开发实战

  • 1. 开发环境配置
  • 2. 爬虫基础
  • 3. 基本库的使用
  • 3.1使用urllib
  • 3.1.1 发送请求
  • 1. urlopen()
  • 2. Request
  • 3. 高级用法


1. 开发环境配置

2. 爬虫基础

3. 基本库的使用

3.1使用urllib

  • request : 它是最基本的HTTP 请求模块,可以用来模拟发送请求。就像在浏览器里输入网址,然后回车一样,只需要给库方法传入URL 以及额外的参数,就可以模拟实现这个过程了。
  • error : 异常处理模块,如果出现请求错误, 我们可以捕获这些异常,然后进行重试或其他操作以保证程序不会意外终止。
  • parse : 一个工具模块,提供了许多URL 处理方法,比如拆分、解析、合并等。
  • robotparser :主要是用来识别网站的robots.txt 文件,然后判断哪些网站可以爬,哪些网站不可以爬,它其实用得比较少。

3.1.1 发送请求

1. urlopen()
import urllib.request
response= urllib.request.urlopen( ' https://www.python.org')
pri「1t(response. read(). decode (’ utf-8'))

urlopen()得到的是一个HTTPResposne 类型的对象,主要包含read() 、readinto ()、getheader(name )、getheaders () 、fileno ()等方法,以及msg 、version 、status 、reason 、debuglevel 、closed 等属性。

print(response . status)
print(response .getheaders())
print(response  . getheader (『Server'))

#输出
200
[('Server', 'Tengine'),
 ('Content-……096908924e')]
'Tengine'

API

urllib.request.urlopen(
    url,
    data=None,
    timeout=<object object at 0x000002C274D622D0>,
    *,
    cafile=None,
    capath=None,
    cadefault=False,
    context=None,
)

data参数

data 参数是可选的,如果它是字节流编码格式的内容,即bytes 类型,则需要通过bytes()方法转化。如果传递了这个参数,则它的请求方式就不再是GET 方式,而是POST 方式。

data = bytes(urllib.parse.urlencode({'word':'hello'}),encoding='utf8')
response= urllib.request.urlopen('http://httpbin.org/post',data)
print(response.read())

timeout参数

用于设置超时时间,单位为秒,如果请求超出了设置的这个时间, 还没有得到响应, 就会抛出异常

response= urllib.request.urlopen('http://httpbin.org/get',timeout=1)
print(response.read())

其他参数

参数

作用

context

必须是ssl.SSLContext 类型,用来指定SSL 设置

cafile

指定CA 证书

capath

指定CA 证书路径

2. Request
request = urllib.request.Request('https://creator.douyin.com/content/manage')
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))

请求网页,得到Request类型的对象

API

urllib.request.Request(
    url,
    data=None,
    headers={},
    origin_req_host=None,
    unverifiable=False,
    method=None,
)

参数

说明

url

必传参数

data

必须传bytes(字节流)类

headers

一个字典,它就是请求头

origin_req_host

请求方的host 名称或者IP 地址

origin_req_host

请求方的host 名称或者IP 地址

unverifiable

表示这个请求是否是无法验证的,默认是False ,意思就是说用户没有足够权限来选择接收这个请求的结果

method

一个字符串,用来指示请求使用的方法

headers = {
    'User_Agent':'Mozilla/4.0(compatible;MSIE 5.5;Windows NT)',
    'Host':'httpbin.org'
}
dict = {'name':'Germey'}
data = bytes(parse.urlencode(dict),encoding='utf8')
req = request.Request(url,data,headers,method='POST')
response = request.urlopen(req)
print(response.read().decode('utf-8'))
3. 高级用法

Handler


说明

BaseHandler 类

所有其他Handler 的父类,它提供了最基本的方法

HITPDefaultErrorHandler

处理HTTP 响应错误,错误都会抛出HTTP Error 类型的异常

HTTPRedirectHandler

处理重定向

HTTPCookieProcessor

处理Cookies

ProxyHandler

设置代理, 默认代理为空

HTTPPasswordMgr

管理密码,它维护了用户名和密码的表

HTTPBasicAuthHandler

管理认证,如果一个链接打开时需要认证,那么可以用它来解决认证问题

Opener

之前使用的Request 和urlopen( )相当于类库为你封装好了极其常用的请求方法,利用它们可以完成基本的请求

Opener 可以使用open()方法,返回的类型和urlopen()如出一辙

一般利用利用Handler来构建Opener

验证——HTTPBasicAuthHandler

from urllib.request import HTTPPasswordMgrWithDefaultRealm, HTTPBasicAuthHandler, build_opener
from urllib.request import URLError

username = 'username'
password = 'password'
url = 'http://localhost:5000/'

p = HTTPPasswordMgrWithDefaultRealm()#实例化
p.add_password(None,url,username,password)#添加url及用户和密码
auth_handler = HTTPBasicAuthHandler(p)
opener = build_opener(auth_handler)

try:
    result = opener.open(url)
    html = result.read().decode('utf-8')
    print(html)
except URLError as e:
    print(e.reason)