网络爬虫网络爬虫(webcrawler),过去常被称为网络蜘蛛(spider),是一种自动浏览万维网并获取信息的机器人程序(或脚本)根据一定的规则。广泛用于互联网搜索引擎。用过互联网和浏览器的人都知道,网页除了供用户阅读的文字信息外,还包含一些超链接。网络爬虫系统通过网页中的超链接信息不断获取网络上的其他页面。正因为如此,网络数据采集的过程就像是在网络上漫游的爬虫或蜘蛛,所以被形象地称为网络爬虫或网络蜘蛛。理想情况下,所有ICP(InternetContentProviders)都应该为自己的网站提供API接口,以共享他们允许其他程序获取的数据。在这种情况下,不需要爬虫。国内著名的电商平台(如淘宝、京东等)、社交平台(如腾讯微博等)都提供了自己的OpenAPI,但这些OpenAPI通常控制着可以访问的数据捕获和捕获数据的频率。限制。对于大多数企业而言,及时获取行业相关数据是企业生存的重要环节之一。然而,大多数公司缺乏行业数据是其先天不足。合理利用爬虫获取数据并从中提取具有商业价值的信息至关重要。当然,爬虫还有很多重要的应用领域,列举如下:搜索引擎新闻聚合、社交应用、舆情监测、行业数据合法性和背景研究、爬虫合法性研究。游戏规则已经建立了一定的道德规范(机器人协议,全称是“网络爬虫排除标准”),但法律部分还在建立和完善中,也就是说这个领域还是一片灰色区暂时。“如果法律不禁止,那是允许的。”如果爬虫获取的是前端显示的数据(网页的公开信息),而不是像浏览器那样获取网站后台的隐私敏感信息,那么不太担心法律法规的约束,因为目前大数据产业链的发展速度远超法律的完善程度。在爬取网站时,需要限制自己的爬虫遵守Robots协议,同时控制网络爬虫程序抓取数据的速度;在使用数据时,必须尊重网站的知识产权(从Web2.0时代开始,虽然Web网站上的很多数据都是由用户提供的,但是网站平台投入了运营成本。当用户注册和发布内容,平台通常已取得数据的所有权、使用权和发行权)。如果违反这些规定,败诉的可能性很大。Robots.txt文件大多数网站都会定义一个robots.txt文件。下面以淘宝的robots.txt文件为例,看看这个网站对爬虫有哪些限制。User-agent:BaiduspiderAllow:/articleAllow:/oshtmlDisallow:/product/Disallow:/User-Agent:GooglebotAllow:/articleAllow:/oshtmlAllow:/productAllow:/spuAllow:/dianpuAllow:/overseaAllow:/listDisallow:/User-agent:BingbotAllow:/articleAllow:/oshtmlAllow:/productAllow:/spuAllow:/dianpuAllow:/overseaAllow:/listDisallow:/User-Agent:360SpiderAllow:/articleAllow:/oshtmlDisallow:/User-Agent:YisouspiderAllow:/articleAllow:/oshtmlDisallow:/User-Agent:SogouspiderAllow:/articleAllow:/oshtmlAllow:/productDisallow:/User-Agent:Yahoo!SlurpAllow:/productAllow:/spuAllow:/dianpuAllow:/overseaAllow:/listDisallow:/User-Agent:*Disallow:/注意上面robots.txt第一段的最后一行,通过设置“Disallow:/”来禁止百度爬虫访问除“允许”指定的页面以外的所有页面。因此,当你在百度上搜索“淘宝”时,在搜索结果的最下方会出现:“因为robots。作为搜索引擎,百度至少表面上遵守了淘宝的robots.txt协议,所以用户无法搜索到淘宝的来自百度的内部产品信息。相关工具介绍HTTP协议在开始讲解爬虫之前,先来回顾一下HTTP(HypertextTransferProtocol),因为我们在网页上看到的通常是浏览器执行HTML语言的结果,而HTTP就是传输HTML数据的协议。与许多其他应用层协议一样,HTTP建立在TCP(传输控制协议)之上,它利用TCP提供的可靠传输服务来实现Web应用程序中的数据交换。根据维基百科上的介绍,设计HTTP的初衷是提供一种发布和接收HTML页面的方式,也就是说,该协议是浏览器和Web服务器之间传输数据的载体。关于本协议的详细信息和目前的发展状况,您可以阅读阮一峰先生的、?系列和《图解HTTPS协议》。开源协议分析工具Ethereal(抓包工具WireShark的前身)拦截访问百度首页时的HTTP请求和响应报文(协议数据)。由于Ethereal拦截了通过网卡的数据,从物理链路层到应用层的Protocol数据可以清楚的看到。HTTP请求(请求行+请求头+空行+[消息体]):HTTP响应(响应行+响应头+空行+消息体):描述:希望这两张像发黄照片一样的截图能帮助你大概明白什么HTTP是一种协议。相关工具1.ChromeDeveloperTools:谷歌浏览器内置的开发者工具。2.POSTMAN:一个强大的网页调试和RESTful请求工具。3.4.HTTPie:命令行HTTP客户端。$http--headerhttp://www.scu.edu.cnHTTP/1.1200OKAccept-Ranges:bytesCache-Control:private,max-age=600Connection:Keep-AliveContent-Encoding:gzipContent-Language:zh-CNContent-Length:14403Content-类型:文本/html日期:星期日,27May201815:38:25GMTETag:“e6ec-56d3032d70a32-gzip”过期:星期日,2018年5月27日:48:25GMTKeep-Alive:超时=5,max=100Last-Modified:星期日,20181855.27:44:22GMTServer:VWebServerVary:User-Agent,Accept-EncodingX-Frame-Options:SAMEORIGIN5.BuiltWith:了解网站所用技术的工具。>>>importbuiltwith>>>builtwith.parse('http://www.bootcss.com/'){'web-servers':['Nginx'],'font-scripts':['FontAwesome'],'javascript-frameworks':['Lo-dash','Underscore.js','Vue.js','Zepto','jQuery'],'web-frameworks':['TwitterBootstrap']}>>>>>>>importssl>>>ssl._create_default_https_context=ssl._create_unverified_context>>>builtwith.parse('https://www.jianshu.com/'){'web-servers':['Tengine'],'web-frameworks':['TwitterBootstrap','RubyonRails'],'programming-languages':['Ruby']}6.python-whois:查询网站所有作者的工具。>>>importwhois>>>whois.whois('baidu.com'){'domain_name':['BAIDU.COM','baidu.com'],'registrar':'MarkMonitor,Inc.','whois_server':'whois.markmonitor.com','referral_url':无,'updated_date':[datetime.datetime(2017,7,28,2,36,28),datetime.datetime(2017,7,27,19,36,28)],'creation_date':[datetime.datetime(1999,10,11,11,5,17),datetime.datetime(1999,10,11,4,5,17)],'expiration_date':[datetime.datetime(2026,10,11,11,5,17),datetime.datetime(2026,10,11,0,0)],'name_servers':['DNS.BAIDU.COM','NS2.BAIDU.COM','NS3.BAIDU.COM','NS4.BAIDU.COM','NS7.BAIDU.COM','dns.baidu.com','ns4.baidu.com','ns3.baidu.com','ns7.baidu.com','ns2.baidu.com'],'status':['clientDeleteProhibitedhttps://icann.org/epp#clientDeleteProhibited','clientTransferProhibitedhttps://icann.org/epp#clientTransferProhibited','clientUpdateProhibitedhttps://icann.org/epp#clientUpdateProhibited','serverDeleteProhibitedhttps://icann.org/epp#serverDeleteProhibited','serverTransferProhibitedhttps://icann.org/epp#serverTransferProhibited','serverUpdateProhibitedhttps://icann.org/epp#serverUpdateProhibited','clientUpdateProhibited(https://www.icann.org/epp#clientUpdateProhibited)','clientTransferProhibited(https://www.icann.org/epp#clientTransferProhibited)','clientDeleteProhibited(https://www.icann.org/epp#clientDeleteProhibited)','serverUpdateProhibited(https://www.icann.org/epp#serverUpdateProhibited)','serverTransferProhibited(https://www.icann.org/epp#serverTransferProhibited)','serverDeleteProhibited(https://www.icann.org/epp#serverDeleteProhibited)'],'电子邮件':['abusecomplaints@markmonitor.com','whoisrelay@markmonitor.com'],'dnssec':'unsigned','name':None,'org':'北京百度网通科技有限公司','address':None,'city':None,'state':'Beijing','zipcode':None,'country':'CN'}7.robotparser:解析robots.txt的工具>>>fromurllibimportrobotparser>>>parser=robotparser.RobotFileParser()>>>parser.set_url('https://www.taobao.com/robots.txt')>>>parser.read()>>>parser.can_fetch('Hellokitty','http://www.taobao.com/article')False>>>parser.can_fetch('Baiduspider','http://www.taobao.com/article')True>>>parser.can_fetch('Baiduspider','http://www.taobao.com/product')False一个简单的爬虫一个基本的爬虫通常分为数据采集(网页下载)、数据处理(网页解析)和数据存储(持久化有用信息)三部分,当然更高级的爬虫在数据采集和处理上会采用并发编程或分布式技术,这就需要调度器(安排线程或进程执行相应的任务),后台管理程序(监控工作爬虫状态、查看抓取结果等。一般来说,爬虫的工作流程包括以下几个步骤:设置爬取目标(种子页/起始页),获取网页。当服务器不可达时,按照指定的重试次数尝试重新下载页面。需要时设置用户代理或隐藏真实IP,否则页面可能无法访问。对获取的页面进行必要的解码操作,然后抓取所需的信息。在获取的页面中,通过一定的方法(如正则表达式)提取页面中的链接信息。对链接做进一步处理(获取页面并重复上述动作)。为后续处理保留有用的信息。下面的例子给出了一个从“搜狐体育”获取NBA新闻头条和链接的爬虫。fromurllib.errorimportURLErrorfromurllib.requestimporturlopenimportreimportpymysqlimportsslfrompymysqlimportError#通过指定字符集解码页面(不是每个网站都将字符集设为utf-8)defdecode_page(page_bytes,charsets=('utf-8',)):page_html=Noneforcharsetincharsets:try:page_html=page_bytes.decode(charset)breakexceptUnicodeDecodeError:pass#logging.error('Decode:',error)returnpage_html#获取页面的HTML代码(通过递归重试指定次数)defget_page_html(seed_url,*,retry_times=3,charsets=('utf-8',)):page_html=Nonetry:page_html=decode_page(urlopen(seed_url).read(),charsets)exceptURLError:#logging.error('URL:',error)ifretry_times>0:returnget_page_html(seed_url,retry_times=retry_times-1,charsets=charsets)returnpage_html#从页面中提取需要的部分(通常链接也可以用正则表达式指定)defget_matched_pa??rts(page_html,pattern_str,pattern_ignore_case=re.I):pattern_regex=重新编译(pattern_str,pattern_ignore_case)returnpattern_regex.findall(page_html)ifpage_htmlelse[]#开始执行爬虫程序,对指定数据进行持久化操作defstart_crawl(seed_url,match_pattern,*,max_depth=-1):conn=pymysql.connect(host='localhost',port=3306,database='crawler',user='root',password='123456',charset='utf8')try:withconn.cursor()ascursor:url_list=[seed_url]#避免重复爬取,通过以下字典控制爬取深度visited_url_list={seed_url:0}whileurl_list:current_url=url_list.pop(0)depth=visited_url_list[current_url]ifdepth!=max_depth:#尽量使用utf-8/gbk/gb2312页面解码的三种字符集:visited_url_list[link]=depth+1page_html=get_page_html(link,charsets=('utf-8','gbk','gb2312'))headings=get_matched_pa??rts(page_html,r'
