天天看点

爬虫学习----反爬虫问题一、反爬虫介绍二、反爬虫的方式三、反反爬虫

一、反爬虫介绍

反爬虫就是某些网站拒绝爬虫访问网站获取数据。我们都知道使用爬虫都是获取网站的数据,而这个过程有可能对网站造成一些伤害。下面我们就看一下爬虫对网站的危害有什么?

第一:网络爬虫就和正常的人通过浏览器去请求服务器获取网页是一样的,但是,网络爬虫的速度快,造成网站的浏览量增高,浪费网站的流量。浪费钱。

第二:网络爬虫的目的是获取数据,在大数据时代数据是每家公司非常宝贵的资源。如果对手获取到自己的数据,就会导致公司竞争力的下降。

因此,很多网站都会有反爬虫机制。检测一下爬虫用户,然后进行限制。

二、反爬虫的方式

反爬虫技术因为技术能力的差别,大致将分为三类;

  • 不返回网页,如不返回内容和延迟网页返回时间
  • 返回数据非目标网页,如返回错误页、返回空白页和爬取多页时均返回同一页
  • 增加爬取数据的难度,如登录才可查看和登录时设置验证码

1. 不返回网页

当爬虫发送请求网页给相应地网站地址后,网站返回404页面,表示服务器无法提供信息或服务器无法回应。也可能长时间不返回数据。一般会通过IP或session进行反爬虫,当某个IP或session的访问量过大,就会封杀这个操作。还有就是通过User-Agent表示浏览器在发送请求时,附带当前浏览器和当前系统环境的参数给服务器。当单个User-Agent超过阈值的时候回予以封锁。

2. 返回非目标网页

返回非目标网页就是返回假数据,有返回空白页或者爬取多页的时候返回同一页。

3. 获取数据变难

网站还会通过增加获取数据的难度反爬虫,如登录后可以好看数据,有的还会设置验证码,比如12306.

三、反反爬虫

反反爬虫就是编写网络爬虫人员针对网站的反爬虫进行反反爬虫,网站识别网络爬虫的机制都是识别用户的异常行为,也就是判断浏览的正常性。因为,我们需要将爬虫伪装的像一个正常的用户访问服务器就可以达到反反爬虫的效果。

1. 修改请求头

可以通过修改请求头的方式,User-Agent代表的就是浏览器,是请求头中最重要的部分,不过不修改请求头,header就会是Python-requests/2.12.4,添加上服务器就会任务是浏览器在访问。同时也可以在请求头中添加Host和Referer。

不添加请求头的请求:

import requests
r = requests.get('http://www.santostang.com')
print(r.request.headers)
           

{'User-Agent': 'python-requests/2.11.1', 'Connection': 'keep-alive', 'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate'}  

添加请求头的请求:

import requests
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}
r = requests.get('http://www.santostang.com', headers=headers)
print(r.request.headers)
           

{'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36', 'Connection': 'keep-alive', 'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate'}  

2. 修改爬虫的间隔时间

爬虫运行的太过频密,一方面对网站的浏览极不友好,另一方面十分容易招致网站的反爬虫。所以设置一下访问的间隔时间。间隔时间的设置要有随机性,不能每次都是一样的间隔,因此,我们可以设置爬取一定页数后休息更长的时间,如设置每爬取5次数据休息10秒。

import requests
from bs4 import BeautifulSoup
import time
import random

link = "http://www.santostang.com"
def scrap(link):
    headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}
    r = requests.get(link, headers=headers)
    html = r.text
    soup = BeautifulSoup(html, 'lxml')
    return soup

soup = scrap(link)
title_list = soup.find_all("h1", class_="post-title")
scrap_times = 0
for eachone in title_list:
    url = eachone.a['href']
    print('开始爬取这篇文章:', url)
    soup_article = scrap(url)
    title = soup_article.find("h1", class_="view-title").text.strip()
    print("这篇博客的标题为:", title)
    
    scrap_times += 1
    if scrap_times % 5 == 0:
        sleep_time = 10 + random.random()
    else:
        sleep_time = random.randint(0, 2) + random.random()
    time.sleep(sleep_time)
    print('开始休息:', sleep_time, '秒')
           

3. 使用IP代理

代理是一种特殊的网络服务,允许一个网路终端通过这个服务与另外一个网络服务终端进行直接的连接。代理就是网络信息的中转器。我们可以维护一个IP池,从而让爬虫程序隐藏自己的真实IP,网上有很多免费的代理IP,使用代理IP获取网页的方法为:

import requests
link = "http://www.baidu.com"
proxies = {'http':'http://xxx.xxx.xxx.xxx:xxxx'} # IP地址:端口号
response = requests.get(link. proxies)
           

但是,ip代理很不稳定,而且速度很慢。

总结:本篇文章主要介绍了反爬虫与反反爬虫,内容其实很简单,在实际应用中,我们会遇到比这很难的反爬虫问题,遵照书中所说,在爬虫时,尽量要做到合理,不要对网站造成过多的压力。

上一篇文章:爬虫学习----提升爬虫速度

下一篇文章:爬虫学习----解决中文乱码问题

注意:本篇学习笔记,是总结唐松老师的《Python网络爬虫从入门到实践》这本书的内容,如果想了解书中详细内容,请自行购买