Python 破解网站反爬虫
@(Python学习-随手记)[爬虫 , Python]
文章目录
背景
- 在爬虫时发现很多很多网站都有反爬虫机制。
- 常见的反爬虫机制有:
判断身份
和IP限制
判断身份
案例:豆瓣电影榜top250(https://movie.douban.com/top250)
In [7]: import requests
# 豆瓣电影榜top250地址
In [8]: url = 'https://movie.douban.com/top250'
# 请求获取响应内容
In [9]: res = requests.get(url)
# 获取文本
In [10]: res.text
Out[10]: ''
- 最终结果什么数据也没有拿到,这就是该网站的身份识别功能,将我们识别成了爬虫,拒绝为我门提供数据内容。
不管是浏览器还是爬虫访问网站时都会带上一些信息用于身份识别,这些信息都会存储在请求头request headers中
。- 请求头中关注
user-agent(用户代理)
:user-agent里包含了操作系统、浏览器类型、版本等信息,通过修改它我们就能成功地伪装成浏览器。
获取user-agent
信息
network
->request headers
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36
封装user-agent
- 将
user-agent
信息封装到headers
字典中,重新请求地址即可获取相关内容
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36'
}
In [13]: import requests
In [14]: url = 'https://movie.douban.com/top250'
In [15]: headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36'}
In [16]: res = requests.get(url,headers=headers)
In [17]: res.text
Out[17]: '<!DOCTYPE html>\n<html lang="zh-CN" class="ua-windows ua-webkit">\n<head>\n …………
IP限制
- IP(Internet Protocol) 全称互联网协议地址,意思是分配给用户上网使用的网际协议的设备的数字标签。它就像我们身份证号一样,只要知道你的身份证号就能查出你是哪个人。
- 正常情况下一个人不会再1s内访问十几次或者上百次网站,如果访问过于频繁,即时修改了
user-agent
伪装成浏览器,也会被识别为爬虫。 - 解决方案:
time.sleep()
降低访问频率
#!/use/bin/python
# -*- coding: utf-8 -*-
"""
@Author : bd
@Create : 2021/7/26 下午3:27
@Package: douban_demo.py
@Description:
@software:PyCharm
"""
import requests
import time
from bs4 import BeautifulSoup
def get_duoban_movie(url):
# 设置请求头
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36'}
# 请求网址
res = requests.get(url=url,headers=headers)
# 将网站数据封装BeautifulSoup对象,并指定解析器
soup = BeautifulSoup(res.text,features='html.parser')
# 查询所有标签为div 并且class='hd'的数据存储在tag对象
items = soup.find_all('div',attrs={'class':'hd'})
for i in items:
tag = i.find('a')
# 电影名称
name = tag.find(class_='title').text
# 电影链接
link = tag['href']
print name,link
if __name__ == '__main__':
url = 'https://movie.douban.com/top250?start={}&filter='
urls = [url.format(num*25) for num in range(10)]
for item in urls:
get_duoban_movie(item)
# 每次请求暂停1s
time.sleep(1)