目录
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
- URLError 是 OSError 的一个子类,用于处理程序在遇到问题时会引发此异常(或其派生的异常),包含的属性 reason 为引发异常的原因。
- 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()关闭连接即可。