网络爬虫之规则

文章目录

  • Requests库入门
    • Requests库安装
    • Requests库的get()方法
    • 爬取网页的通用代码框架
    • HTTP协议及Requests库方法
    • Requests库主要方法解析
  • 网络爬虫的盗亦有道
    • 网络爬虫引发的问题
    • Robots协议
  • Requests库 网络爬虫实战
    • 京东商品页面的爬取
    • 当当网商品页面的爬取
    • 百度搜索关键词
    • 360搜索

Requests库入门

自动爬取HTML页面,自动网络请求提交

Requests库安装

pip install requests
>>> import requests
>>> r = requests.get("http://ww.baidu.com")
>>> r.status_code  #响应状态码
200
>>> r.encoding = 'utf-8'
>>> r.text
'<!DOCTYPE html>\r\n<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> .....

Requests库的get()方法

requests.get(url,params=None,**kwargs)

url:拟获取页面的url链接
params:url中的额外参数,字典或字节流格式,可选
**kwargs:12个控制访问的参数
网络爬虫之规则_第1张图片
Response对象包含服务器返回的所有信息,也包含请求的Request信息

Reaponse对象的属性 说明
r.status_code HTTP请求的返回状态,200表示连接成功,404表示失败
r.text HTTP响应内容的字符串形式,即url对应的页面内容
r.encoding 从HTTP header中猜测的响应内容编码方式
r.apparent_encoding 从内容中分析出的响应内容编码方式(备选编码方式)
r.content HTTP响应内容的二进制形式
>>> import requests
>>> r = requests.get("http://www.baidu.com")
>>> r.status_code
200
>>> type(r)
<class 'requests.models.Response'>
>>> r.headers
{'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Connection': 'keep-alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Mon, 05 Sep 2022 05:27:43 GMT', 'Last-Modified': 'Mon, 23 Jan 2017 13:27:36 GMT', 'Pragma': 'no-cache', 'Server': 'bfe/1.0.8.18', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Transfer-Encoding': 'chunked'}

爬取网页的通用代码框架

异常 说明
requests.ConnectionError 网络连接错误异常,如DNS查询失败、拒绝连接等
requests.HTTPError HTTP错误异常
requests.URLRequired URL缺失异常
requests.TooManyRedirects 超过最大重定向次数,产生重定向异常
requests.ConnectTimeout 连接远程服务器超时异常
requests.Timeout 请求URL超时,产生超时异常
r.raise_for_status() 如果不是200(正确),产生异常 requests.HTTPError
import requests
def getHTMLText(url):
    try:
        r = requests.get(url, timeout = 30)
        r.raise_for_status()  #如果状态不是200则引发HTTPError异常
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return "产生异常"
if __name__ == "__main__":
    url = "http://www.baidu.com"
    print(getHTMLText(url))

HTTP协议及Requests库方法

HTTP协议——Hypertext Transfer Protocol,超文本传输协议

HTTP是一个基于“请求与响应”模式的、无状态的应用层协议

URL——通过HTTP协议存取资源的internet路径,一个URL对应一个数据资源

URL格式—— http://host[:port][path]

  • host:合法的internet主机域名或IP地址
  • port:端口号,缺省端口为80
  • path:请求资源的路径

Requests库主要方法解析

方法 说明
requests.request() 构造一个请求,支撑以下各方法
requests.get() 获取HTML网页的主要方法,对应HTTP的GET
requests.head() 获取HTML网页头信息的方法,对应HTTP的GET
requests.post() 向HTML网页提交POST请求的方法,对应HTTP的POST
requests.put() 向HTML网页提交PUT请求的方法,对应HTTP的PUT
requests.patch() 向HTML网页提交局部修改请求,对应HTTP的PATH
requests.delete() 向HTML网页提交删除请求,对应HTTP的DELETE

requests.request(method, url, **kwargs)
method: 请求方式,对于get/put/post/patch/head/delete
url: 拟获取页面的url链接
**kwargs: 控制访问的参数

params: 字典或字节序列,作为参数增加到url中
data: 字典、字节序列或文件对象,作为request的内容
json: JSON格式的数据,作为Request的内容
headers: 字典,HTTP定制头
cookies: 字典或CookieJar,request中的cookie
auth: 元组,支持HTTP认证功能
files: 字典类型,传输文件
timeout: 设定超时时间,秒为单位
proxies: 字典类型,设定访问代理服务器,可以增加登录认证
allow_redirects: True/False ,默认为true,重定向开关
stream: True/False ,默认为true,获取内容立即下载开关
verify: True/False ,默认为true,认证SSL开关
cert: 本地SSL证书路径

网络爬虫的盗亦有道

网络爬虫引发的问题

Robots协议

Robots Exclusion Standard 网络爬虫排除标准
作用:网站告知网络爬虫有些页面可以抓取,哪些不行
形式:在网站根目录下的robots.txt文件

遵守方式:

Requests库 网络爬虫实战

京东商品页面的爬取

>>> import requests
>>> r = requests.get("https://item.jd.com/10037107525048.html")
>>> r.status_code
200
>>> r.encoding
'utf-8'
>>> r.text[:1000]
'\n\n\n    \n    \n    NOC LOC电动升降桌 NOC LOC智能联动电动站立办公电脑桌子 智能办公升降桌 标准款【图片 价格 品牌 报价】-京东\n    \n    \n    \n    \n    \n    \n    \n        \n    \n    import requests
url = "https://item.jd.com/100012014948.html"
try:
    kv = {'user-agent':'Mozilla/5.0'}
    r = rquests.get(url, headers = kv)
    r.raise_for_status()
    r.encoding = r.apparent_encoding
    print(r.text[:1000])
except:
    print("爬取失败")

当当网商品页面的爬取

>>> import requests
>>> url = "http://product.dangdang.com/25225942.html"
>>> kv = {'user-agent':'Mozilla/5.0'}
>>> r = requests.get(url, headers = kv)
>>> r.status_code
200
>>> r.request.headers
{'user-agent': 'Mozilla/5.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
>>> r.text[:1000]
' \r\n \r\n \r\n\r\n\r\n\r\n\r\n上网登录页 \r\n\r\n\r\n
                    
                    

你可能感兴趣的:(爬虫,前端,python)