爬虫基础(笔记)——1.urllib库与requests库

目录

urllib库

Urllib.request

1.修改报头,模拟浏览器

2.Post请求

Urllib.error

Urllib.parse

Urllib.robotparser

Requests库

get请求

修改报头,模拟浏览器

requests请求连接关闭问题

添加cookie


urllib库

1.修改报头,模拟浏览器

1.1使用build_opener()修改报头

#导入相应模块,使用 import urllib 或 from urllib import request 均可
import urllib

#自定义User-Agent
headers=("User-Agent",“Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36”)

#自定义opener
opener=urllib.request.build_opener()

#将自定义UA添加到自定义opener中
opener.addheaders=[headers]

#糗事百科主页
url = "https://www.qiushibaike.com/"

#开始爬取并返回数据
data=opener.open(url).read()

1.2使用add_header()添加报头

import urllib

#自定义User-Agent
header="Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"

#urlopen并不支持添加UA,cookie等信息,于是用Request类构建了一个完整的请求,增加了headers等一些信息
req=urllib.request.Request(url)

#添加自定义UA
req.add_header('User-Agent',header)

data=urllib.request.urlopen(req).read()




#----------------------
#关于urllib.request.Request()

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

#url:url 地址。
#data:发送到服务器的其他数据对象,post请求时使用,默认为 None。
#headers:HTTP 请求的头部信息,字典格式。(重点要知道UA,cookie,Referer)
#origin_req_host:请求的主机地址,IP 或域名。
#unverifiable:很少用整个参数,用于设置网页是否需要验证,默认是False。。
#method:请求方法, 如 GET、POST、DELETE、PUT等

 

2.Post请求

import urllib.request,parse

# 提交到表单页面
url = 'https://www.runoob.com/try/py3/py3_urllib_test.php'

# 提交数据
data = {'name':'RUNOOB', 'tag' : '菜鸟教程'}

#头部信息
header = {
    'User-Agent':'Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}

# 对参数进行编码,解码使用
data = urllib.parse.urlencode(data).encode('utf8') 
urllib.parse.urldecode

# 请求处理
request = urllib.request.Request(url, data, header)

# 读取结果
reponse = urllib.request.urlopen(request).read()

code = request.getcode()

 

  • Urllib.error

  1. URLError 是 OSError 的一个子类,用于处理程序在遇到问题时会引发此异常(或其派生的异常),包含的属性 reason 为引发异常的原因。
  2. HTTPError 是 URLError 的一个子类,用于处理特殊 HTTP 错误例如作为认证请求的时候,包含的属性 code 为 HTTP 的状态码, reason 为引发异常的原因,headers 为导致 HTTPError 的特定 HTTP 请求的 HTTP 响应头。

 

  • Urllib.parse

    from urllib.pares import urlparse
    
    o=urlparse("https://www.runoob.com/?s=python+%E6%95%99%E7%A8%8B")
    
    print(o) 
    
    #结果
    ParseResult(scheme='https',netloc='www.runoob.com',path='/',params='',query='s=python+%E6%95%99%E7%A8%8B', fragment='')
    
    
    #从结果可以看出,内容是一个元组,包含 6 个字符串:协议,位置,路径,参数,查询,判断。

     

  • Urllib.robotparser

用于解析 robots.txt 文件 (robots.txt(统一小写)是一种存放于网站根目录下的 robots 协议,它通常用于告诉搜索引擎对网站的抓取规则)

rp = urllib.robotparser.RobotFileParser()

set_url(url)

 设置 robots.txt 文件的 URL。

read()

 读取 robots.txt URL 并将其输入解析器。

parse(lines)

 解析行参数。

can_fetch(useragent, url)

 如果允许 useragent 按照被解析 robots.txt 文件中的规则来获取 url 则返回 True。

mtime()

返回最近一次获取 robots.txt 文件的时间。 这适用于需要定期检查 robots.txt 文件更新情况的长时间运行的网页爬虫。

modified()

 将最近一次获取 robots.txt 文件的时间设置为当前时间。

crawl_delay(useragent)

为指定的 useragent 从 robots.txt 返回 Crawldelay 形参。 如果此形参不存在或不适用于指定的 useragent 或者此形参的 robots.txt 条目存在语法错误,则返回 None。

request_rate(useragent)

以 named tuple RequestRate(requests, seconds) 的形式从 robots.txt 返回 Requestrate 形参的内容。 如果此形参不存在或不适用于指定的 useragent 或者此形参的 robots.txt 条目存在语法错误,则返回 None。

site_maps()

 以 list() 的形式从 robots.txt 返回 Sitemap 形参的内容。 如果此形参不存在或者此形参的 robots.txt 条目存在语法错误,则返回 None。

 

Requests库

  • get请求

    #有参数的get请求
    
    import requests
    
    #设置参数
    Param = {"s": "python"}
    
    url = "https://www.runoob.com/"
    
    response = requests.get(url, params = param).text

     

  • 修改报头,模拟浏览器

    import requests
    
    #自定义User-Agent
    headers = {"User-Agent", "Mozilla/5.0 (Windows NT 6.4; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2218.107 Safari/537.36"}
    
    url = "https://www.qiushibaike.com/"
    
    #带上自定义UA进行请求
    #其中 verify=False 表示移除ssl认证
    response = requests.get(url, headers = headers, verify = False)
    
    #将响应内容转码为指定编码方式
    response.encoding("utf-8")
    
    #输出响应url,属性的值将是任何重定向后获得的最终url
    print(response.url)
    
    #按文本格式输出响应中的数据信息
    print(response.text)
    
    #按二进制格式输出响应中的数据信息
    print(response.content)
    
    #按json格式(字典)输出响应中的数据信息
    print(response.json())
    
    #输出响应的状态码
    print(response.status_code)
    
    #输出返回的cookies
    print(response.cookies)
    
    #requests请求连接关闭
    #若不关闭连接,会导致连接池爆满,报错:Max retries exceeded with url
    response.close()

     

  • requests请求连接关闭问题

网上的爬虫绝大多数没有关闭连接,不使用代理的话会导致连接池爆满

报错:Max retries exceeded with url

关键字参数stream设置,是保持socket通信,默认是false。如果你在请求中把 stream 设为 True,Requests 无法将连接释放回连接池,除非你消耗了所有的数据,或者调用了 Response.close()。 这样会带来连接效率低下的问题。如果你发现你在使用 stream=True 的同时还在部分读取请求的 body(或者完全没有读取 body),那么你就应该考虑使用 with 语句发送请求,这样可以保证请求一定会被关闭:

with requests.get('http://httpbin.org/get', stream=True) as r:

      # 在此处理响应

 

  • 添加cookie

    import requests
    
    #建立session(对话),可保证cookie不会丢失
    session = requests.session()
    
    #post请求数据
    data = {"username","123456",
            "password","123456"}
    
    response = session.post(url, data)
    
    #输出得到的cookie
    print(response.cookies)
    
    #第一种方式:用得到cookie的session对象即可成功访问登陆成功后的其他页面
    response2 = session.get(url2)
    
    #第二种方式:处理上面返回的cookie,把其转换成字典,再进行访问
    cookie = requests.utils.dict_from_cookiejar(response.cookies)
    
    response2 = requests.get(url2, cookies=cookie)


    Session对象能保持长连接,不过在使用过程中发现脚本走完后底层的TCP端口没有断开连接要等一会才释放。

    解决方法:在一系列请求调用结束之后使用requests.session.close()关闭连接即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值