1. 需求:
- 在使用 requests 爬取网页时,如果访问失败则进行多次重试,以增加爬虫的健壮性;
2. 实现:
import requests
improt time
import etree
import json
def request_url(url, request_type, result_type, post_data=None):
'''
向目标 url 发送 gert 或 post 请求,以获取网页的response
:params url: 目标 url 地址
:params request_type: 请求类型,post 或 get
:params result_type: 结果类型,html 或 text
:params post_data: 如果请求为 post 类型时,需要提交 post data 参数
:return: result, 默认为 None
'''
header = {
'User-Agent': 'user agent'
}
i = 0
while i < 3:
time.sleep(10) # 如果请求失败,则等待十秒再次请求
try:
if reqyest_type == 'get': # 请求类型为 get
response = requests.get(url=url, timeout=10, headers=header)
else: # 请求类型为 post
if post_data:
response = requests.post(url=url, timeout=10, data=post_data, headers=header)
else:
response = requests.post(url=url, timeout=10, headers=header)
response_text = response.content.decode('utf-8', 'ignore') # 注意网站编码方式
if result_type == 'html':
result = etree.HTML(response_text )
else:
result = response_text
if result:
return result
else:
return None
except:
i += 1
#-----------------------------------------------------------------
# 发送 get 请求用法
#-----------------------------------------------------------------
url = 'https://www.xxx-1.com'
result_html = request_url(url=url, request_type='get', result_type='html')
if result:
text = result_html.xpath('/xx/xx/xx/xx/text()') # 通过 xpath 获取目标元素
else:
pass
#-----------------------------------------------------------------
# 发送 post 请求用法
#-----------------------------------------------------------------
url = 'http://www.xxx.com'
post_data = {
'key_1': 'value_1',
'key_2': 'value_2'
}
result_text = request_url(url=url, request_type='post', result_type='text', post_data=post_data)
if not result_text:
pass
网友评论