什么是反爬?
简单来说反爬就是区别人类行为和机器行为,当你使用python代码模拟浏览器访问服务器时,服务器会识别这个浏览器相关信息,一般来说识别Cookie、User-Agent、Host字段来确认你是爬虫机器人还是人类。
识别方式大致有以下几种:
1.通过访问频率判断,比如在某一段时间里访问该网站次数过多,容易被识别。
2.会设置headers请求头所需参数,服务器会检测浏览器所提供headers信息,如果缺少相关参数或者是网站特定使用的秘钥,都会停止访问。
3.IP限制,通过检测同一IP访问网站频率是否超出所定阈值来封杀IP。
4.字体反爬,也就是所提取的文本内容是人类看不懂的乱码
5.验证码识别,相关的有滑动验证码、文本字符验证码、极验证码、简单算术验证码等等
IP被封:
字体反爬:
验证码:
总之,前端人员不想让爬虫那么容易拿到数据就对了~~~
爬取酷狗TOP500所遇的反爬:
网站链接: 酷狗TOP500_排行榜_乐库频道_酷狗网
爬取目标:获取前50歌曲名
1.首先使用以下爬虫代码查看response(resp)相应体数据
#正常流程进行访问该网页
import random
import requests as re
# from bs4 import BeautifulSoup
import parsel
if __name__=='__main__':
url = 'https://www.kugou.com/yy/rank/home/1-8888.html'
# reps = re.get(url=url, headers=headers, timeout=10)
reps=re.get(url=url)
html_text = reps.text
print('获取的response文本',reps.text)
print('获取的状态码',reps.status_code)
2.通过进入网页查看网页源代码,按ctrl+F搜索歌曲名字,发现能所需到,说明这是一个静态网页
3.进入自己所获取的response数据中,输入歌曲名字,发现搜不到,再看此时网页状态码403表示访问失败,说明被反爬了
4.所以我们需要伪装一下,通过headers进行伪装,修改成下面代码
import random
import requests as re
# from bs4 import BeautifulSoup
import parsel
#我们创建了User-Agent所需的列表,使用random函数随机调用
headers_list = [
"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0",
"Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; InfoPath.3; rv:11.0) like Gecko",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",
"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)",
# √
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
"Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
"Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11",
"Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; The World)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Avant Browser)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)",
"Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
"Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
"Mozilla/5.0 (iPad; U; CPU OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
"Mozilla/5.0 (Linux; U; Android 2.3.7; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
"MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
"Opera/9.80 (Android 2.3.4; Linux; Opera Mobi/build-1107180945; U; en-GB) Presto/2.8.149 Version/11.10",
"Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13",
"Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; en) AppleWebKit/534.1+ (KHTML, like Gecko) Version/6.0.0.337 Mobile Safari/534.1+",
"Mozilla/5.0 (hp-tablet; Linux; hpwOS/3.0.0; U; en-US) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/233.70 Safari/534.6 TouchPad/1.0",
"Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaN97-1/20.0.019; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) BrowserNG/7.1.18124",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Titan)",
"UCWEB7.0.2.37/28/999",
"NOKIA5700/ UCWEB7.0.2.37/28/999",
"Openwave/ UCWEB7.0.2.37/28/999",
"Mozilla/4.0 (compatible; MSIE 6.0; ) Opera/UCWEB7.0.2.37/28/999",
"Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25"
]
#ip列表,同理
ip_list = [
'47.113.90.161',
'61.216.156.222',
'101.200.127.149',
'47.106.105.236',
'122.226.57.70',
'223.96.90.216',
'101.200.127.149',
'47.113.90.161',
'111.3.118.247',
'120.194.55.139',
'223.96.90.216',
'27.42.168.46',
'112.14.47.6',
'223.96.90.216',
'183.247.199.215'
]
#随机获取user-agent
headers = {'User-Agent': random.choice(headers_list)}
ip = random.choice(ip_list)
if __name__=='__main__':
url = 'https://www.kugou.com/yy/rank/home/1-8888.html'
reps = re.get(url=url, headers=headers, timeout=10) # 伪装请求
html_text = reps.text
print('获取的response文本',reps.text)
print('获取的状态码',reps.status_code)
5.识别结果:状态码OK,能找到歌曲名字
6.获取数据代码:
构建思路:一级标签ul,二级标签li
7.获取歌曲名字:前22首
后记:
这次所遇上的反爬是最为常见的,网页识别所需headers信息判定是否给你网页相关数据,使用headers伪装进行数据爬取,所提取歌曲数据时,需要有一二级标题遍历相的思路。
@@@各位冲冲冲!!!