爬虫与反爬虫
爬虫:
我们为了获得任何信息而采用任何手段对某一个网站进行的‘攻击’行为,之所以称之为‘攻击行为’,主要是因为我们对网站的爬虫过程会对网站造成不同程度上的影响。而爬虫与我们手动点击访问网站数据的区别主要就在于这个是批量的操作
反爬虫:
网站为了维护自己的核心安全而采取的抑制爬虫的手段
常见的反爬机制:
1、基于User-Agent反爬
思想:
服务器后台访问的User-Agent进行统计,单位时间内同一个User-Agent访问的次数超过特定的阀值,就会被不同程度的封禁IP,从而造成无法进行爬取的状况
解决:
方案一:
将常见的User-Agent封装到一个文件中,别人总结好的常用的User-Agent链接:https://www.cnblogs.com/zrmw/p/9332801.html
在爬取的过程中首先导入这个文件,然后随机选择这里面的某一个User-Agent
方案二:
在python中使用第三方类库:fake_useragent ,生成随机的User-Agent
2、基于IP反爬
思想:
后端服务器对访问进行统计,单位时间内同一个IP地址访问的次数超过一个特定的值,就会不同程度的封禁IP,导致无法进行相关的爬虫操作
解决方案:
使用不同的IP进行访问,设置一定的访问停滞,random.sleep(3)
常见的就是购买专业代理构建可用代理池。可以免费或者花钱购买可用的IP地址,但是免费的有很多是不可用的(虽然收费的也有很多不可以用)
西刺代理网址:https://www.xicidaili.com/
构建代理池的方法:
前期准备:
注册西刺账户、购买专业版代理,购买完成之后,获取API并复制下来,实现以下代码来构建代理池
import requests from lxml import etree from fake_useragent import UserAgent # 获取User-Agent def get_random_ua(): ua = UserAgent() return ua.random # 购买代理后复制的API粘贴到此处 url = 'API' # 获取所有代理IP的地址和端口号 # [{'http':'http://xxxx:xx','https':'https://xxxx:xxx'},] def get_ip_list(): # 获取user-agent headers = { 'User-Agent' : get_random_ua() } # 已知的可用代理IP proxies = { 'http': 'http://182.35.81.10:9999', 'https': 'https://182.35.81.10:9999' } html = requests.get(url,proxies=proxies,headers=headers).text # 解析 parse_html = etree.HTML(html) # r_list: [<element tr at xxx>,<element tr at xxx>] r_list = parse_html.xpath('//tr') # 空列表,存放所有ip和port proxy_list = [] # 依次遍历 for r in r_list[1:]: ip = r.xpath('./td[2]/text()')[0] port = r.xpath('./td[3]/text()')[0] proxy_list.append( { 'http':'http://{}:{}'.format(ip,port), 'https':'https://{}:{}'.format(ip,port) } ) # proxy_list: [{},{},{},{}] return proxy_list # 测试代理,建立代理IP池 def proxy_pool(): # 调用上面函数 proxy_list = get_ip_list() # 可用代理IP列表 useful_proxy = [] # 测试代理是否可用 for proxy in proxy_list: # proxy: {'http':'http://xxxx:xx'} headers = {'User-Agent':get_random_ua()} try: res = requests.get( url = 'http://httpbin.org/get', headers=headers, proxies = proxy, timeout = 5 ) print(res.text) useful_proxy.append(proxy) except Exception as e: print('{}不能用'.format(proxy)) continue return useful_proxy if __name__ == '__main__': proxy_pool() #useful_proxy即为我们构建的代理池。
3、动态页面抓包
思想:
当我们进入到某个网页的时候,我们想通过查看源代码解析页面上的结构,看到的内容却不是我们网页显示的内容;或者,当我们浏览网站的时候网页结构显示不全,只有滑动鼠标才能将剩余的信息显示出来,这时候我们就需要手动抓包来进行分析了
解决
打开页面->查看网页源代码->搜索关键字,发现搜索不到关键字,这个其实就是我们所说的动态页面。这个时候按F12进行刷新页面,在network的左侧一栏可以找到很多个包,查看headers中的requets-url,此时滚动鼠标或者其他方式查看页面的另一条数据,方法相同,查看requests-url,对比这两个url的不同点,然后发现里面的规律并进行分析