Python 破解网站反爬虫

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)

资料

BeautifulSoup中的find_all 方法参数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值