python爬虫基础
1、初识爬虫
1.rebots协议
网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取,但它仅仅是互联网中的约定而已,可以不用遵守。例如:https://www.taobao.com/robots.txt
2.谷歌浏览器插件
● XPath Helper
● Web Scraper
● Toggle JavaScript
● User-Agent Switcher for Chrome
● EditThisCookie
● SwitchySharp
插件下载地址:
- https://extfans.com/
- https://chrome.zzzmh.cn/#/index
安装步骤:
1、在应用商店下载好插件后解压缩,直接拖进去就可以啦:
3.requests发送网络请求以及常用属性
需求:通过requests向百度首页发送请求,获取百度首页数据
import requests
url = "https://www.baidu.com"
response = requests.get(url=url)
print("---状态码如下---")
print(response.status_code)
print("---bytes类型数据:---")
print(response.content)
print("---str类型数据---")
print(response.text)
print("---str类型数据(utf-8)---")
print(response.content.decode("utf-8"))
常用属性如下:
● response.text 响应体str类型
● respones.content 响应体bytes类型
● response.status_code 响应状态码
● response.request.headers 响应对应的请求头
● response.headers 响应头
● response.request.headers.get('cookies') 响应对应请求的cookie
● response.cookies 响应的cookie(经过了set-cookie动作)
● response.url请求的URL
4、iter_content方法
如果下载一个较大的资源,例如一个视频,可能需要的下载时间较长,在这个较长的下载过程中程序是不能做别的事情的(当然可以使用多任务来解决),如果在不是多任务的情况下,想要知道下载的进度,此时就可以通过类似迭代的方式下载部分资源。
使用iter_content
r = requests.get('https://www.baidu.com', stream=True)
with open('test.html', 'wb') as f:
for chunk in r.iter_content(chunk_size=100):
f.write(chunk)
在获取数据时,设置属性stream=True
● 如果设置了stream=True,那么在调用iter_content方法时才会真正下载内容
● 如果没设置stream属性则调用requests.get就会耗费时间下载
5、重定向与历史请求
思考:为什么打印出来的url不是请求的url呢?
想要搞清楚这个问题,就要知道requests的重定向问题。
requersts的默认情况
默认情况下,requests发送的请求除了方式为HEAD之外,其余的请求例如GET、POST等都是能自动进行重 定向的
这也就是为什么上面明明访问的是http://www.baidu.com而打印出来之后是https://m.baidu.com/?from=844b&vit=fps的原因
取消自动重定向
在发送请求的时候,可以通过如下的设置,取消requests模块的自动重定向功能
requests.get(url, allow_redirects=False)
6、SSL证书问题
在浏览网页时,可能会遇到以下这种情况:
出现这个问题的原因是:ssl证书不安全导致的。
7、retrying模块的使用
使用超时参数能够加快我们整体的运行速度。但是在普通的生活中当我们使用浏览器访问网页时,如果发生速度很慢的情况,我们会做的选择是刷新页面。那么在代码中,我们是否也可以刷新请求呢?
在本小节中我们使用retrying模块来完成需求。
# 安装指令如下:
pip install retrying -i https://pypi.tuna.tsinghua.edu.cn/simple
作用:
- 使用retrying模块提供的retry模块
- 通过装饰器的方式使用,让被装饰的函数反复执行
- retry中可以传入参数stop_max_attempt_number,让函数报错后继续重新执行,达到最大执行次数的上限,如果每次都报错,整个函数报错,如果中间有一个成功,程序继续往后执行
import requests
from retrying import retry
num = 1
@retry(stop_max_attempt_number=3)
def _parse_url(url):
global num
print("第%d次尝试" % num)
num += 1
headers = {
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1"
}
# 超时的时候会报错并重试
response = requests.get(url, headers=headers, timeout=3)
# 状态码不是200,也会报错并重试
assert response.status_code == 200 # 此语句是"断言",如果assert后面的条件为True则呈现继续运行,否则抛出异常
return response
def parse_url(url):
# 进行异常捕获
try:
response = _parse_url(url)
except Exception as e:
print("产生异常:", e)
# 报错返回None
response = None
return response
if __name__ == '__main__':
url = "https://chinasoftinc.com/owa"
# url = "https://www.baidu.com"
print("----开始----")
r = parse_url(url=url)
print("----结束----", "响应内容为:", r)
标签:python,基础,爬虫,url,https,print,requests,com,response
From: https://www.cnblogs.com/pdxt666/p/18333167