第06课Python 《从零开始学习网络爬虫》——反反爬

什么是反爬?

简单来说反爬就是区别人类行为和机器行为,当你使用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伪装进行数据爬取,所提取歌曲数据时,需要有一二级标题遍历相的思路。

@@@各位冲冲冲!!!

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烧酒调调

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值