wordpress 模板带数据,温州网站制作优化,山东网站建设服务商,网站和新媒体建设管理使用urllib
了解一下 urllib 库#xff0c;它是 Python 内置的 HTTP 请求库#xff0c;也就是说不需要额外安装即可使用。它包含如下 4 个模块。 request#xff1a;它是最基本的 HTTP 请求模块#xff0c;可以用来模拟发送请求。就像在浏览器里输入网址然后回车一样…使用urllib
了解一下 urllib 库它是 Python 内置的 HTTP 请求库也就是说不需要额外安装即可使用。它包含如下 4 个模块。 request它是最基本的 HTTP 请求模块可以用来模拟发送请求。就像在浏览器里输入网址然后回车一样只需要给库方法传入 URL 以及额外的参数就可以模拟实现这个过程了。 error异常处理模块如果出现请求错误我们可以捕获这些异常然后进行重试或其他操作以保证程序不会意外终止。 parse一个工具模块提供了许多 URL 处理方法比如拆分、解析、合并等。 robotparser主要是用来识别网站的 robots.txt 文件然后判断哪些网站可以爬哪些网站不可以爬它其实用得比较少。
发送请求
urlopen
response urllib.request.urlopen(‘https://www.python.org’)
可选参数 data 参数如果要添加该参数需要使用 bytes 方法将参数转化为字节流编码格式的内容即 bytes 类型。另外如果传递了这个参数则它的请求方式就不再是 GET 方式而是 POST 方式。
timeout 参数timeout 参数用于设置超时时间单位为秒意思就是如果请求超出了设置的这个时间还没有得到响应就会抛出异常。如果不指定该参数就会使用全局默认时间。它支持 HTTP、HTTPS、FTP 请求。
Request
request urllib.request.Request(‘https://python.org’)
response urllib.request.urlopen(request)
参数
url 用于请求 URL这是必传参数其他都是可选参数
data 如果要传必须传 bytes字节流类型的。
headers 是一个字典它就是请求头
unverifiable 表示这个请求是否是无法验证的默认是 False意思就是说用户没有足够权限来选择接收这个请求的结果
method 是一个字符串用来指示请求使用的方法
各种 Handler 子类继承这个 BaseHandler 类举例如下。 HTTPDefaultErrorHandler 用于处理 HTTP 响应错误错误都会抛出 HTTPError 类型的异常。 HTTPRedirectHandler 用于处理重定向。 HTTPCookieProcessor 用于处理 Cookies。 ProxyHandler 用于设置代理默认代理为空。 HTTPPasswordMgr 用于管理密码它维护了用户名密码的表。 HTTPBasicAuthHandler 用于管理认证如果一个链接打开时需要认证那么可以用它来解决认证问题。
处理异常
URLError
URLError 类来自 urllib 库的 error 模块它继承自 OSError 类是 error 异常模块的基类由 request 模块产生的异常都可以通过捕获这个类来处理。
它具有一个属性 reason即返回错误的原因。
HTTPError:
它是 URLError 的子类专门用来处理 HTTP 请求错误比如认证请求失败等。它有如下 3 个属性。 code返回 HTTP 状态码比如 404 表示网页不存在500 表示服务器内部错误等。 reason同父类一样用于返回错误的原因。 headers返回请求头。
解析链接 urlparse实现 URL 的识别和分段 urlunparse将分段合并为url urlsplit这个方法和 urlparse 方法非常相似只不过它不再单独解析 params 这一部分只返回 5 个结果 urlunsplit与 urlunparse 方法类似它也是将链接各个部分组合成完整链接的方法传入的参数也是一个可迭代对象例如列表、元组等唯一的区别是长度必须为 5 urljoin我们可以提供一个 base_url基础链接作为第一个参数将新的链接作为第二个参数 urlencode为了更加方便地构造参数我们会事先用字典来表示。要转化为 URL 的参数时只需要调用该方法即可。 parse_qs有一串 GET 请求参数利用 parse_qs 方法就可以将它转回字典 parse_qsl用于将参数转化为元组组成的列表 unquote进行 URL 解码 quote该方法可以将内容转化为 URL 编码的格式。URL 中带有中文参数时有时可能会导致乱码的问题此时用这个方法可以将中文字符转化为 URL 编码
使用requests
抓取网页
import requests
import reheaders {User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36
}
r requests.get(https://www.zhihu.com/explore, headersheaders)
pattern re.compile(explore-feed.*?question_link.*?(.*?)/a, re.S)
titles re.findall(pattern, r.text)
print(titles)目前可以使用的’User-Agent’: ‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36’
对于网页的内容这里使用正则表达式进行匹配
抓取二进制数据
图片、音频、视频这些文件本质上都是由二进制码组成的由于有特定的保存格式和对应的解析方式我们才可以看到这些形形色色的多媒体。所以想要抓取它们就要拿到它们的二进制码。
以 GitHub 的站点图标为例来看一下
import requestsr requests.get(https://github.com/favicon.ico)
print(r.text)
print(r.content)运行结果 可以注意到前者出现了乱码后者结果前带有一个 b这代表是 bytes 类型的数据。由于图片是二进制数据所以前者在打印时转化为 str 类型也就是图片直接转化为字符串这理所当然会出现乱码。
接着我们将刚才提取到的图片保存下来
r requests.get(https://github.com/favicon.ico)
with open(favicon.ico, wb) as f:f.write(r.content)同样地音频和视频文件也可以用这种方法获取。
添加headers
与 urllib.request 一样我们也可以通过 headers 参数来传递头信息。
POST请求
data {name: germey, age: 22}
r requests.post(http://httpbin.org/post, datadata)响应
发送请求后得到的自然就是响应。在上面的实例中我们使用 text 和 content 获取了响应的内容。此外还有很多属性和方法可以用来获取其他信息比如状态码、响应头、Cookies 等
输出 status_code 属性得到状态码输出 headers 属性得到响应头输出 cookies 属性得到 Cookies输出 url 属性得到 URL输出 history 属性得到请求历史。
requests 还提供了一个内置的状态码查询对象 requests.codes
下面列出了返回码和相应的查询条件方便编程时使用
# 信息性状态码
100: (continue,),
101: (switching_protocols,),
102: (processing,),
103: (checkpoint,),
122: (uri_too_long, request_uri_too_long), # 成功状态码
200: (ok, okay, all_ok, all_okay, all_good, \\o/, ✓),
201: (created,),
202: (accepted,),
203: (non_authoritative_info, non_authoritative_information),
204: (no_content,),
205: (reset_content, reset),
206: (partial_content, partial),
207: (multi_status, multiple_status, multi_stati, multiple_stati),
208: (already_reported,),
226: (im_used,), # 重定向状态码
300: (multiple_choices,),
301: (moved_permanently, moved, \\o-),
302: (found,),
303: (see_other, other),
304: (not_modified,),
305: (use_proxy,),
306: (switch_proxy,),
307: (temporary_redirect, temporary_moved, temporary),
308: (permanent_redirect, resume_incomplete, resume,), # These 2 to be removed in 3.0 # 客户端错误状态码
400: (bad_request, bad),
401: (unauthorized,),
402: (payment_required, payment),
403: (forbidden,),
404: (not_found, -o-),
405: (method_not_allowed, not_allowed),
406: (not_acceptable,),
407: (proxy_authentication_required, proxy_auth, proxy_authentication),
408: (request_timeout, timeout),
409: (conflict,),
410: (gone,),
411: (length_required,),
412: (precondition_failed, precondition),
413: (request_entity_too_large,),
414: (request_uri_too_large,),
415: (unsupported_media_type, unsupported_media, media_type),
416: (requested_range_not_satisfiable, requested_range, range_not_satisfiable),
417: (expectation_failed,),
418: (im_a_teapot, teapot, i_am_a_teapot),
421: (misdirected_request,),
422: (unprocessable_entity, unprocessable),
423: (locked,),
424: (failed_dependency, dependency),
425: (unordered_collection, unordered),
426: (upgrade_required, upgrade),
428: (precondition_required, precondition),
429: (too_many_requests, too_many),
431: (header_fields_too_large, fields_too_large),
444: (no_response, none),
449: (retry_with, retry),
450: (blocked_by_windows_parental_controls, parental_controls),
451: (unavailable_for_legal_reasons, legal_reasons),
499: (client_closed_request,), # 服务端错误状态码
500: (internal_server_error, server_error, /o\\, ✗),
501: (not_implemented,),
502: (bad_gateway,),
503: (service_unavailable, unavailable),
504: (gateway_timeout,),
505: (http_version_not_supported, http_version),
506: (variant_also_negotiates,),
507: (insufficient_storage,),
509: (bandwidth_limit_exceeded, bandwidth),
510: (not_extended,),
511: (network_authentication_required, network_auth, network_authentication)高级用法
再来了解下 requests 的一些高级用法如文件上传、Cookies 设置、代理设置等
文件上传
假设上传刚才的图标文件
files {file: open(favicon.ico, rb)}
r requests.post(http://httpbin.org/post, filesfiles)
print(r.text)http://httpbin.org/post可用来进行文件上传的测试会返回相应的数据 Cookies
获取 Cookies 的过程
r requests.get(https://www.baidu.com)
print(r.cookies)
for key, value in r.cookies.items():print(key value)首先调用 cookies 属性即可成功得到 Cookies可以发现它是 RequestCookieJar 类型。然后用 items 方法将其转化为元组组成的列表遍历输出每一个 Cookie 的名称和值实现 Cookie 的遍历解析。 将自己的cookie添加到请求头中即可登陆自己的账号。
会话维持
在 requests 中如果直接利用 get 或 post 等方法的确可以做到模拟网页的请求但是这实际上是相当于不同的会话也就是说相当于你用了两个浏览器打开了不同的页面。
第一个请求利用 post 方法登录了某个网站第二次想获取成功登录后的自己的个人信息你又用了一次 get 方法去请求个人信息页面。实际上这相当于打开了两个浏览器是两个完全不相关的会话能成功获取个人信息吗那当然不能。
Session 对象可以方便地维护一个会话而且不用担心 cookies 的问题它会帮我们自动处理好
requests.get(http://httpbin.org/cookies/set/number/123456789)
r requests.get(http://httpbin.org/cookies)这里我们请求了一个测试网址 http://httpbin.org/cookies/set/number/123456789。请求这个网址时可以设置一个 cookie名称叫作 number内容是 123456789随后又请求了 http://httpbin.org/cookies此网址可以获取当前的 Cookies。
运行结果如下
{“cookies”: {} }
并没有获取到cookieCookie 保存在客户端浏览器Session 保存在服务器端。
使用session
s requests.Session()
s.get(http://httpbin.org/cookies/set/number/123456789)
r s.get(http://httpbin.org/cookies)
print(r.text)运行结果
{ “cookies”: {“number”: “123456789”} }
SSL证书验证
requests 还提供了证书验证的功能。当发送 HTTP 请求的时候它会检查 SSL 证书我们可以使用 verify 参数控制是否检查此证书。其实如果不加 verify 参数的话默认是 True会自动验证。
如果请求一个 HTTPS 站点但是证书验证错误的页面时就会报SSL错误将参数设置为False即可
response requests.get(https://www.12306.cn, verifyFalse)代理设置
对于某些网站在测试的时候请求几次能正常获取内容。但是一旦开始大规模爬取对于大规模且频繁的请求网站可能会弹出验证码或者跳转到登录认证页面更甚者可能会直接封禁客户端的 IP导致一定时间段内无法访问。
那么为了防止这种情况发生我们需要设置代理来解决这个问题这就需要用到 proxies 参数。可以用这样的方式设置
import requestsproxies {http: http://10.10.1.10:3128,https: http://10.10.1.10:1080,
}requests.get(https://www.taobao.com, proxiesproxies)超时设置
在本机网络状况不好或者服务器网络响应太慢甚至无响应时我们可能会等待特别久的时间才可能收到响应甚至到最后收不到响应而报错。使用timeout参数计算发出请求到服务器返回响应的时间。请求分为连接读取两个阶段timeout为这两者的总和。
身份认证
在配置服务器设置或进入一些管理页面如rabbitmq的管理页面会需要我们进行身份验证即输入用户名和密码才能进行配置。此时可以使用 requests 自带的身份认证功能示例如下
import requests
from requests.auth import HTTPBasicAuth r requests.get(http://localhost:5000, authHTTPBasicAuth(username, password))
print(r.status_code)requests 提供了一个更简单的写法可以直接传一个元组它会默认使用 HTTPBasicAuth 这个类来认证
r requests.get(http://localhost:5000, auth(username, password))Prepared Request
可以将请求表示为数据结构其中各个参数都可以通过一个 Request 对象来表示
from requests import Request, Sessionurl http://httpbin.org/post
data {name: germey}
headers {User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36
}
s Session()
req Request(POST, url, datadata, headersheaders)
prepped s.prepare_request(req)
r s.send(prepped)
print(r.text)