爬虫干货与反爬虫学习总结
爬虫
网络爬虫是自动从网页中获取网络资源(文字、图片)的程序。通常用于从提供数据资源的网站获取大量数据,同时也可以进行数据处理。搜索网站(如百度)实际上就是爬虫。
拓扑学习:需要先学会python语言(推荐python教程),需要对网页前端的知识有一定了解(推荐前端教程)。标准的爬虫会使用爬虫框架(如scrapy)。
近年,大多数网站都有针对网络爬虫的协议(如robots协议),盗亦有道,请在使用爬虫前仔细查阅并遵守规定。单从学习技术的角度来说,爬取的数据不作他用的情况下还是可以大胆实践的,但也不应开启过多爬虫干扰网站正常功能。
仅写干货,作为个人的知识学习和经验总结,各代码的详细用法可以网上查询。
参考链接:
requests库:网络请求
涉及计算机网络的部分知识,了解原理有助于更好的实现爬虫,但不了解也不影响。requests库可以实现对网络请求的一些基本操作,最常用的是可以操控程序发送http协议的get请求,是爬虫获取网页资源的基础操作。status_code是http请求的返回状态,200表示请求成功。
1 | import requests |
其中url是要爬取的网址。例如:
1 | url = "https://mugaiashe.github.io/" |
现在的多数网站都设有反爬虫机制,最基本的就是检查网络请求的header。我常用的设置是:
1 | headers = {'user-agent': "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)", |
如果需要设置代理:
1 | proxies = { |
beautiful soup库:查找数据
beautiful soup库用于处理网页数据,将获取的网页数据(很长的字符串)转换为特定的数据类型,使之可以读取,并能进行一些基本操作(如查找特定数据),简称bs4。
1 | from bs4 import BeautifulSoup |
查找数据
制定规则找到需要的数据是爬虫技术中需要注意的关键点!多观察网页前端的结构,常通过class进行定位。用soup.find_all找到soup网页中所有符合条件的块,对于每一块可以使用get获取对应的块信息(如图片img的url):
1 | divimg = soup.find_all('img', {'class': 'x5yr21d xu96u03 x10l6tqk x13vifvy x87ps6o xh8yej3'}) |
可以向下遍历,也可以向上遍历查找:
1 | a = div.find_parent('a') |
re库:正则表达式
常使用re库,利用正则表达式的方式提取网页数据。因为网页中数据的表达方式各异,正则表达式能方便我们查找和提取数据。
1 | ustr = re.findall(r'by .+? on', alt) |