测试网址
爬取页面范围:首页
爬取信息:标题、正文、时间
F12刷新查看请求类型:get请求且没有传递参数
编写请求
import requests
# from parsel
url = 'http://www.porters.vip/verify/uas/index.html'
response = requests.get(url=url)
# 403服务器已收到请求但是拒绝执行
# 404相应资源不存在
# 200服务器已经成功处理了请求
print(response.status_code)
print("-"*20)
print(response.text)
输出结果
403
--------------------
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.19.4</center>
</body>
</html>
打印了403状态码,说明服务器已收到请求但是拒绝执行,遇到了反爬虫,
浏览器和测试工具都可以正常访问,偏偏爬虫程序不可以,肯定是遇到反爬虫了。但它究竟是如何识别爬虫的呢? 3种不同的客户端向服务器端发起请求,其中两种能够得到正常的响应,Python 代码却不能,并且是在第一次请求的时候就被拒绝了,说明在第一次访问时就被识别了。3种不同的客户端,意味着可能有3种不同的客户端身份标识,而在HTTP中只有User-Agent是最接近身份标识这个答案的。我们不妨尝试一下, 在爬虫程序中使用浏览器或者Postman 的身份标识。Requests 库允许使用自定义的请求头信息,我们将刚才的代码改为:
浏览器请求头
import requests
from lxml import etree
# 支持正则、css、xpath,不支持BS4
import parsel
url = 'http://www.porters.vip/verify/uas/index.html'
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
}
# response类型=<class 'requests.models.Response'>
response = requests.get(url=url, headers=headers)
response_text = response.text
response_html = etree.HTML(response_text)
print(response.status_code)
result_titles = response_html.xpath("//div[@class='media']/div/h4/a/text()")
result_bodys = response_html.xpath("//div[@class='media']/div/p[1]/text()")
result_times = response_html.xpath("//div[@class='media']/div/p[2]/text()")
print(result_titles)
print(result_bodys)
print(result_times)
输出结果
200
['中牟县晨阳路学校:中牟县小学...', '...省略']
['3月7日上午,中牟县201...' , '...省略']
['2019-03-08 20:42:37', '2019-03-0...', '...省略']
Postman请求头
# 修改的部分
headers = {
'user-agent': 'PostmanRuntime/7.26.8'
}
输出结果
200
['中牟县晨阳路学校:中牟县小学...', '...省略']
['3月7日上午,中牟县201...' , '...省略']
['2019-03-08 20:42:37', '2019-03-0...', '...省略']
成功反反爬虫