来源:python中国网 时间:2019-07-18

  基于requests模块的简单get请求。

  需求:爬取百度首页。

  注意User-Agent:

  User-Agent:是请求头header的一部分,客户端的身份标识,使用浏览器发起的请求,身份标识为浏览器。

  User-Agent检测:网站服务器端通过检测User-Agent值辨别该请求是否为爬虫程序,因为正常用户对网站发起的请求的载体一定是某款浏览器,如果网站检测到某一请求载体身份标识不是浏览器,则让其请求失败。

  UA伪装:通过修改/伪装爬虫请求的User-Agent使得爬虫程序看起来像浏览器。具体实现见下属代码:

# -*- coding: utf-8 -*-
import requests

#自定义请求头信息:UA伪装,将User-Agent键值对加到headers参数中即可
headers={
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',
    }
url = 'https://www.baidu.com/'

#发起请求,timeout参数设定的秒数过后停止等待响应
r = requests.get(url=url,headers=headers,timeout=10)
#指定解码方式(非必须项,requests可以自动判断)
r.encoding = 'utf-8'

#获取响应数据
page_text = r.text

#存储数据
with open('baidu.html','w',encoding='utf-8') as f:
    f.write(page_text)

print('网页编码是',r.encoding) #打印默认值,如果人为定义了则打印的是你设置的值
print('请求的url是',r.url)
print('响应头',r.headers)
print('相应状态码',r.status_code)
print('请求历史',r.history)
print('是否重定向',r.is_redirect)
# print('二进制内容',r.content)
# 通过dir函数查看返回结果r包含哪些属性和方法
print(dir(r))

D:python3installpython.exe D:/python/py3script/test.py
网页编码是 utf-8
请求的url是 https://www.baidu.com/
响应头 {'Bdpagetype': '1', 'Bdqid': '0x9a4a4d880009d2ce', 'Cache-Control': 'private', 'Connection': 'Keep-Alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Cxy_all': 'baidu+f46bb602e124780d589733fe09b0b454', 'Date': 'Wed, 17 Jul 2019 07:13:17 GMT', 'Expires': 'Wed, 17 Jul 2019 07:12:40 GMT', 'P3p': 'CP=" OTI DSP COR IVA OUR IND COM "', 'Server': 'BWS/1.1', 'Set-Cookie': 'BAIDUID=079CE5E7DEF0FF536737DCAC48512046:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com, BIDUPSID=079CE5E7DEF0FF536737DCAC48512046; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com, PSTM=1563347597; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com, delPer=0; path=/; domain=.baidu.com, BDSVRTM=0; path=/, BD_HOME=0; path=/, H_PS_PSSID=1445_21087_29523_29518_28518_29099_28839_29220_26350_29071_28704; path=/; domain=.baidu.com', 'Strict-Transport-Security': 'max-age=172800', 'Vary': 'Accept-Encoding', 'X-Ua-Compatible': 'IE=Edge,chrome=1', 'Transfer-Encoding': 'chunked'}
相应状态码 200
请求历史 []
是否重定向 False
['__attrs__', '__bool__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__nonzero__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_content', '_content_consumed', '_next', 'apparent_encoding', 'close', 'connection', 'content', 'cookies', 'elapsed', 'encoding', 'headers', 'history', 'is_permanent_redirect', 'is_redirect', 'iter_content', 'iter_lines', 'json', 'links', 'next', 'ok', 'raise_for_status', 'raw', 'reason', 'request', 'status_code', 'text', 'url']

Process finished with exit code 0


  注意:访问r.text之时,requests会使用其推测的文本编码。大多数情况下requests模块可以正确解码,但是会有识别错误的时候,用r.encoding属性来指定解码方式,这样r.text就能使用正确解码了。

  此外:平时上网打不开网页我们会多刷新几次,所以爬虫请求网页也应该如此,以上程序太过简陋,我们可以借用递归来加强这个程序。

# -*- coding: utf-8 -*-
import requests

def get_html(url,retry=2):
    try:
        r = requests.get(url=url,headers=headers,timeout=10)
    except Exception as e:
        print(e)
        if retry > 0:
            get_html(url,retry-1)
    else:
        r.encoding = 'utf-8'
        page_text = r.text
        return page_text


if __name__ == "__main__":

    # 自定义请求头信息
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',
    }
    url = 'https://www.baidu.com/'
    html = get_html(url)
    with open('baidu.html','w',encoding='utf-8') as f:
        f.write(html)


代码解释:
1、用自定义函数get_html封装requests请求
2、利用递归函数设置参数retry=2,请求失败则减1再请求直到retry <= 0