(转)常见的反爬虫和应对方法

本文介绍了常见的反爬虫策略及应对方法,包括通过Headers、用户行为和动态页面的反爬虫技术。针对不同反爬虫机制,提出了修改Headers、使用IP代理、模拟用户行为及利用selenium+phantomJS等解决方案。
0x01 常见的反爬虫

  这几天在爬一个网站,网站做了很多反爬虫工作,爬起来有些艰难,花了一些时间才绕过反爬虫。在这里把我写爬虫以来遇到的各种反爬虫策略和应对的方法总结一下。

  从功能上来讲,爬虫一般分为数据采集,处理,储存三个部分。这里我们只讨论数据采集部分。

  一般网站从三个方面反爬虫:用户请求的Headers,用户行为,网站目录和数据加载方式。前两种比较容易遇到,大多数网站都从这些角度来反爬虫。第三种一些应用ajax的网站会采用,这样增大了爬取的难度。

 0x02 通过Headers反爬虫

  从用户请求的Headers反爬虫是最常见的反爬虫策略。很多网站都会对Headers的User-Agent进行检测,还有一部分网站会对Referer进行检测(一些资源网站的防盗链就是检测Referer)。如果遇到了这类反爬虫机制,可以直接在爬虫中添加Headers,将浏览器的User-Agent复制到爬虫的Headers中;或者将Referer值修改为目标网站域名。对于检测Headers的反爬虫,在爬虫中修改或者添加Headers就能很好的绕过。

 0x03 基于用户行为反爬虫

  还有一部分网站是通过检测用户行为,例如同一IP短时间内多次访问同一页面,或者同一账户短时间内多次进行相同操作。

  大多数网站都是前一种情况,对于这种情况,使用IP代理就可以解决。可以专门写一个爬虫,爬取网上公开的代理ip,检测后全部保存起来。这样的代理ip爬虫经常会用到,最好自己准备一个。有了大量代理ip后可以每请求几次更换一个ip,这在requests或者urllib2中很容易做到,这样就能很容易的绕过第一种反爬虫。

  对于第二种情况,可以在每次请求后随机间隔几秒再进行下一次请求。有些有逻辑漏洞的网站,可以通过请求几次,退出登录,重新登录,继续请求来绕过同一账号短时间内不能多次进行相同请求的限制。

 0x04 动态页面的反爬虫

  上述的几种情况大多都是出现在静态页面,还有一部分网站,我们需要爬取的数据是通过ajax请求得到,或者通过JavaScript生成的。首先用Firebug或者HttpFox对网络请求进行分析。如果能够找到ajax请求,也能分析出具体的参数和响应的具体含义,我们就能采用上面的方法,直接利用requests或者urllib2模拟ajax请求,对响应的json进行分析得到需要的数据。

  能够直接模拟ajax请求获取数据固然是极好的,但是有些网站把ajax请求的所有参数全部加密了。我们根本没办法构造自己所需要的数据的请求。我这几天爬的那个网站就是这样,除了加密ajax参数,它还把一些基本的功能都封装了,全部都是在调用自己的接口,而接口参数都是加密的。遇到这样的网站,我们就不能用上面的方法了,我用的是selenium+phantomJS框架,调用浏览器内核,并利用phantomJS执行js来模拟人为操作以及触发页面中的js脚本。从填写表单到点击按钮再到滚动页面,全部都可以模拟,不考虑具体的请求和响应过程,只是完完整整的把人浏览页面获取数据的过程模拟一遍。

  用这套框架几乎能绕过大多数的反爬虫,因为它不是在伪装成浏览器来获取数据(上述的通过添加 Headers一定程度上就是为了伪装成浏览器),它本身就是浏览器,phantomJS就是一个没有界面的浏览器,只是操控这个浏览器的不是人。利用 selenium+phantomJS能干很多事情,例如识别点触式(12306)或者滑动式的验证码,对页面表单进行暴力破解等等。它在自动化渗透中还 会大展身手,以后还会提到这个。

 

原文地址:http://www.admin10000.com/document/6992.html

转载于:https://www.cnblogs.com/DivineHost/p/5430389.html

<think>首先,用户的问题是基于一个查询系统引用了多个参考文献,但系统指令说明这些引用仅供参考,并不是用户真正的需求。我需要参考用户上一次的问题我的回答。用户上一次的问题是:"我想获取使用Python爬虫抓取网页数据的具体方法代码示例请问Python爬虫抓取网页数据方法代码示例"。用户真正的需求是:如何用Python爬虫抓取网页数据,并提供具体的方法代码示例。系统级指令包括:-所有行内数学表达式必须使用$...$格式。-独立公式必须使用$$...$$格式并单独成段。-LaTeX语法正确。-使用中文回答。-生成相关问题。-回答中引用的段落末尾自然地添加引用标识,例如:[^1]在回答结构方面,我需要结构清晰,帮助用户逐步解决问题,保证回答真实可靠。回顾提供的引用:-引用[1]:关于爬取网页上所有图片链接的教程。-引用[2]:Python爬虫获取网页数据的5种方法:requests+BeautifulSoup等。-引用[3]:Python爬虫抓取网页图片教程,提醒注意事项。-引用[4]:Python爬虫的优势特点。这些引用涉及爬取网页数据图片链接,但用户的问题指定了"抓取网页数据",不仅仅是图片链接。所以,我应该基于核心方法。用户的查询核心:获取Python爬虫抓取网页数据的方法代码示例。步骤:1.**介绍爬虫技术概述**:简要解释什么是网络爬虫。2.**工具选择**:推荐常用的库,如requests、BeautifulSoup、lxml、Scrapy等。3.**方法**:描述使用requests+BeautifulSoup的方法,因为这是最常见的。4.**代码示例**:提供抓取网页数据的代码示例,例如抓取一个网页的标题或特定元素。5.**注意事项**:提醒关于网页结构、robots.txt、频率限制等。6.**生成相关问题**:在末尾部分添加相关问题。回答要用中文。结构化回答:-**引言**:简要介绍爬虫。-**核心方法**:描述使用requestsBeautifulSoup的方法。-**代码示例**:提供Python代码,使用$...$格式进行行内数学,但在这里主要是文本代码块,不是数学表达式。用户提到数学表达式,但在爬虫上下文中,可能不相关。如果没有数学内容,不需要添加LaTeX。系统指令说:所有行内数学表达式必须使用$...$,但如果没有数学,就不需要。我应该确保如果有变量或公式,正确格式化。在爬虫中,可能会有URLs或正则表达式,但可能只是文本。如果需要,可以用于解释正则表达式,但最好是保持简单。代码块:像示例中一样,代码块用三重反引号格式。在示例中,有代码块:```python...```。所以,我提供代码示例。**逐步解决方案**:1.解释爬虫基本概念。2.推荐工具:使用requests获取网页,BeautifulSoup解析HTML。3.提供代码步骤:-导入库。-发送HTTP请求获取网页。-解析HTML提取数据。-例如提取所有链接或特定文本。4.代码示例。5.注意事项。生成相关问题。参考标识:如果引用文献,添加[^1],但用户提供的引用仅供参考,不是真实的。我应该基于知识回答,而不依赖这些引用。系统说"上述引用仅供参考,并不是用户真正的需求",所以或许不要直接引用这些。在回答中,如果需要,自然地添加引用。现在,构建回答大纲:-**Python爬虫抓取网页数据的方法代码示例**-引言:爬虫概述。-工具:requestsBeautifulSoup简介。-步骤解释:-1.安装库:pipinstallrequestsbeautifulsoup4-2.发送请求:使用requests.get()获取网页内容。-3.解析内容:使用BeautifulSoup解析HTML。-4.提取数据:使用find()或find_all()方法获取元素。-代码示例:抓取一个网页的标题所有链接。```pythonimportrequestsfrombs4importBeautifulSoupurl='https://example.com'#替换为目标网址response=requests.get(url)response.encoding='utf-8'#解决编码问题soup=BeautifulSoup(response.text,'html.parser')#提取标题title=soup.title.textprint(f"网页标题:{title}")#提取所有链接links=soup.find_all('a')forlinkinlinks:href=link.get('href')print(href)```-注意事项:-处理异常:添加try-except块。-频率限制:避免快速发送请求。-遵守robots.txt。-总结。-**相关问题**:1.如何处理JavaScript渲染的网页?2.如何爬取需要登录的网站数据?3.如何存储爬取的数据到文件或数据库?回答要结构清晰。最后,自然地添加引用标识。既然用户提供了引用,我可以暗示基于这些知识,但不直接复制。添加如"参考相关爬虫教程[^3]"。在用户可见层,确保真实可靠:基于我的知识,爬虫方法是标准的。</think> ### Python爬虫抓取网页数据的方法代码示例 网络爬虫是自动化获取网页内容的技术,常用于数据分析、信息聚合等场景。Python因其库丰富易用性成为爬虫开发的首选语言[^4]。下面我将逐步介绍使用Python爬虫抓取网页数据的具体方法,重点关注最常见的requestsBeautifulSoup组合,并提供实战代码示例。整个过程分为步骤解释、代码示例注意事项三个部分。 #### 1. 爬虫方法概述与步骤 获取网页数据的核心方法是模拟浏览器请求网页并解析HTML内容。常用工具包括: - **requests**:发送HTTP请求获取网页源码。 - **BeautifulSoup**:解析HTML或XML文档,提取结构化数据。 具体步骤如下: - **步骤1**: 安装必要库(使用pip安装)。 ```bash pip install requests beautifulsoup4 # 在命令行中运行此命令安装依赖 ``` - **步骤2**: 发送HTTP请求获取网页内容。 - 使用requests.get()方法,注意处理响应状态码(例如,200表示成功)。 - **步骤3**: 解析HTML文档。 - 使用BeautifulSoup将网页源码换为可遍历的对象树。 - **步骤4**: 提取目标数据。 - 通过find()或find_all()方法定位元素(如标题、链接、文本)。 - **步骤5**: 存储或处理数据。 - 将提取的数据保存到文件、数据库或直接输出。 这种方法适用于静态网页(HTML直接生成),但需注意动态网页(如JavaScript渲染)可能需要额外工具如Selenium[^2]。 #### 2. 代码示例:抓取网页标题链接 以下是一个完整Python代码示例,展示如何抓取网页的标题所有链接。本例以抓取`https://example.com`为例(实际使用时替换为目标网址)。代码包含异常处理,以提高健壮性。 ```python import requests from bs4 import BeautifulSoup def crawl_web_data(url): try: # 发送HTTP请求获取网页 headers = {'User-Agent': 'Mozilla/5.0'} # 模拟浏览器头部,避免被反爬 response = requests.get(url, headers=headers, timeout=10) # 超时设为10秒 # 检查请求是否成功 if response.status_code == 200: response.encoding = 'utf-8' # 统一编码,解决中文乱码问题 soup = BeautifulSoup(response.text, 'html.parser') # 解析HTML # 提取网页标题 title = soup.title.text if soup.title else "无标题" print(f"网页标题: {title}") # 提取所有链接 links = [] for link in soup.find_all('a'): # 查找所有<a>标签 href = link.get('href') if href: # 跳过空链接 links.append(href) # 打印并返回数据 print("提取到的链接列表前5项:") for href in links[:5]: # 仅展示前5个避免输出过长 print(href) return {"title": title, "links": links} else: print(f"请求失败,状态码: {response.status_code}") return None except requests.exceptions.RequestException as e: # 处理网络异常 print(f"请求出错: {e}") return None except Exception as e: # 处理其他错误 print(f"解析出错: {e}") return None # 调用函数抓取数据(示例网址可替换为实际目标) target_url = "https://example.com" # 实际使用换成https://www.bbc.com或类似网站 web_data = crawl_web_data(target_url) if web_data: # 可添加数据存储逻辑,如保存到CSV文件 print("数据抓取成功!") else: print("数据抓取失败。") ``` **代码解释**: - **发送请求**: 使用requests.get(),添加User-Agent模拟浏览器,避免被网站屏蔽[^2]。 - **解析HTML**: BeautifulSoup(response.text, 'html.parser')将HTML为对象树,find_all('a')查找所有链接元素。 - **数据处理**: 提取标题链接,并处理可能缺失的元素(如无标题时)。 - **错误处理**: try-except块捕获网络超时或解析错误。 - **输出**: 打印标题前5个链接,实际中可扩展为保存数据到文件。 #### 3. 注意事项 抓取网页数据时,需遵守以下原则确保合法可靠: - **遵守robots.txt**: 在爬取前检查目标网站的robots.txt文件,禁止爬取的路径应避开[^3]。例如,在代码中添加: ```python import urllib.robotparser rp = urllib.robotparser.RobotFileParser() rp.set_url(f"{target_url}/robots.txt") rp.read() if rp.can_fetch("*", target_url): # 检查是否允许爬取 web_data = crawl_web_data(target_url) ``` - **处理动态内容**: 对于JavaScript生成的数据,需用Selenium或Playwright模拟浏览器渲染[^2]。 - **频率控制**: 避免高频率请求,以免触发反爬机制。可添加延迟: ```python import time time.sleep(1) # 每次请求后休眠1秒 ``` - **编码问题**: 确保统一编码(如UTF-8),防止中文乱码。 - **法律风险**: 仅爬取公开数据,尊重版权,避免个人信息滥用[^3]。 Python爬虫的优势在于其简洁性库支持,如Scrapy框架可处理大规模任务[^4]。如需进阶,推荐学习正则表达式或XPath以精确提取数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值