爬虫(Spider),这里固然不是说结网捉虫的蜘蛛那样的生物学上的爬虫,这里说的是互联网上的爬虫,由程序员编写,具备必定的逻辑性可以完成在指定范围内进行信息收集的程序。javascript
听说爬虫占据了互联网上60%多的流量,可想而知这个无比庞大的互联网上有多少只辛辛苦苦矜矜业业的爬虫们啊。html
爬虫,主要分为搜索引擎类的爬虫和具备必定目标的专用爬虫。前者索引整个web世界,让人们能方便的搜索到本身想要的信息,通常网站也很欢迎这些爬虫。然后者有时候目的性比较强,爬取范围也比较窄,通常收集数据用于二次加工或者数据分析等。这里主要讲的就是第二种爬虫。java
爬虫的工做很简单,一句话归纳就是找到目标入口而后在目标页面获取目标内容。python
爬虫的原理也不复杂,主要是经过http或者其余协议,发送请求到目标接口,而后解析返回的内容成结构化数据存储到本地。git
制做一个爬虫基本须要以下步骤:程序员
- 肯定目标:
制做爬虫首先须要清楚本身的目的,但愿获取哪些信息。- 观察目标:
而后经过观察目标网站或者程序,获取目标信息的入口和索引方式。- 结构提取:
进入内容页面,观察感兴趣区域的页面结构,而后考虑经过正则表达式或者xpath等方式提取目标内容。- 编码实现:
前3步完成以后,最后就是使用线程工具或者本身编码实现这个爬虫了。
完成这些,基本上就能够认为制做出来一个网络爬虫了,而后就是让这个爬虫启动运行起来。至于怎么处理爬到的数据,那就不是爬虫的事了。github
下面介绍2种爬虫制做方法。web
因为爬虫这种需求比较多,因此网络上有一些专门的工具,能经过简单的配置就能制做爬虫。ajax
推荐一个国内软件商制做的比较傻瓜式的爬虫生成工具:火车采集器,免费版基本就够用了。正则表达式
具体用法参考其视频教程,基本上看完视频就能知道怎么用了。
这个对于一些简单的场景基本够用了,主要优点是配置简单,搭建方便,傻瓜化运行。
在现有工具没法知足需求或者想要学习爬虫的原理的时候,也能够经过编写代码来制做爬虫。
固然,也不须要要从tcp/ip或者http协议这么底层开始,能够经过一些开源的爬虫框架来编写爬虫。其中以python语言做为基础的爬虫框架比较多,这里以scrapy为例。
scrapy是一个开源的python爬虫框架,也是目前最流行的爬虫框架之一,里面集成了一些爬虫经常使用的功能,基本上只须要写爬虫的逻辑就行。
以一个最简单的例子来讲明scrapy的用法。
须要有一个爬虫天天去查询百度搜索“爬虫”的前2页搜索结果,而后分析新排序到前2页的搜索结果(其余后处理)。
首先在百度输入“爬虫”搜索,跳转到搜索结果页。观察结果页面的URL结果,能够看到:
第1页URL:
https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=%E7%88%AC%E8%99%AB&oq=%E7%88%AC%E8%99%AB&rsv_pq=9fd63f8600011b0b&rsv_t=3b30%2BHymEU5wSsRM5DGZD1gCwRjvljkpEIr3hXU0nOba6AHvpIdgH6DokZ4&rqlang=cn&rsv_enter=0&rsv_sug3=1&rsv_sug1=1&rsv_sug7=100&rsv_sug4=470
第2页URL:
https://www.baidu.com/s?wd=%E7%88%AC%E8%99%AB&pn=10&oq=%E7%88%AC%E8%99%AB&ie=utf-8&usm=1&rsv_pq=cb75075a0001681d&rsv_t=0986khHCUHLdfml7ymZib2JecfTLlPX%2Ft57JycxSQwzQh5miPsj1IKCeEGQ&rsv_page=1
URL里面有很多参数,可能用不着,因此试着简化这个URL:
第1页URL:
https://www.baidu.com/s?wd=爬虫&pn=0
第2页URL:
https://www.baidu.com/s?wd=爬虫&pn=10
那么爬虫的入口就知道了。
scrapy用的是xpath作结构解析,因此这里须要获取到目标区域的xpath。xpath是什么参考这里。
chrome浏览器有一个很好的插件能够很方便的获取到某个html节点的xpath,XPath Helper,先安装好它。
打开chrome,输入URL(https://www.baidu.com/s?wd=爬虫&pn=0),而后F12进入开发者模式。经过鼠标找到第1个搜索结果的html节点,而后右键:copy-Copy XPath。
获得搜索结果html节点的xpath分别是:
第1页1-10搜索结果: //*[@id="1"]/h3/a //*[@id="2"]/h3/a ... //*[@id="10"]/h3/a 第2页11-20搜索结果: //*[@id="11"]/h3/a //*[@id="12"]/h3/a ... //*[@id="20"]/h3/a
那么目标区域的xpath就很明显了,获取到xpath以后获得href属性和text结果就好了。
固然也能够经过其余的xpath获取到这些节点位置,这个并非惟一的。
scrapy安装这里再也不赘述,经过pip install scrapy便可安装,国内能够把pip的源设置为阿里云或者豆瓣的源,而后执行上述命令安装。
本节所有代码在:baidu_spider
进入工做目录,命令行输入:
scrapy startproject baidu_spider
而后进入baidu_spider目录,打开items.py,输入以下代码:
# -*- coding: utf-8 -*- import scrapy class BaiduSpiderItem(scrapy.Item): # define the fields for your item here #搜索结果的标题 title = scrapy.Field() #搜索结果的url url = scrapy.Field()
这里定义的是爬虫爬取结果的结构,包含搜索结果的标题和搜索结果的url。
打开settings.py,修改下面行:
#ROBOTSTXT_OBEY = True ROBOTSTXT_OBEY = False
这个修改是由于百度的robots.txt禁止其余爬虫去爬它,因此须要把robots协议这个君子协定暂时单方面关掉。
而后进入spider目录,新建baiduSpider.py,输入下面代码:
# -*- coding: UTF-8 -*- import scrapy from scrapy.spiders import CrawlSpider from scrapy.selector import Selector from scrapy.http import Request from baidu_spider.items import BaiduSpiderItem from selenium import webdriver import time class BaiduSpider(CrawlSpider): name='baidu_spider' def start_requests(self): #函数名不可更改,此函数定义了爬虫的入口地址 #使用浏览器访问 self.browser = webdriver.Chrome('d:/software/chromedriver.exe') for i in range(0,20,10): url = 'https://www.baidu.com/s?wd=爬虫&pn=%d' % i yield self.make_requests_from_url(url) def parse(self, response): #函数名不可更改,此函数定义了爬虫的页面解析 #打开浏览器访问页面 self.browser.get(response.url) time.sleep(1) selector = Selector(text=self.browser.page_source) page_start = int(response.url.split('=')[-1]) for i in range(1,11): item = BaiduSpiderItem() xpath = '//*[@id="%d"]/h3/a' % (page_start+i) print xpath print selector.xpath(xpath + '/@href').extract() item['url'] = selector.xpath(xpath + '/@href').extract()[0] item['title'] = selector.xpath(xpath + '//text()').extract() yield item
这里用到了selenium和chrome webdriver,用于使用chrome模拟正经常使用户的访问,这是由于百度作了防爬虫的措施,因此为了简单,咱们就伪装咱们的爬虫就是正经常使用户。
selenium经过pip安装便可,chrome webdriver在此处下载,而后安装上。把baiduSpider.py中的webdriver.Chrome行中的可执行文件地址改为本身的安装地址。
所有代码编写完毕,在scrapy.cfg那一层目录(顶层)中输入下面的命令启动爬虫:
scrapy crawl baidu_spider -o result.csv
一切顺利的话会输出一些log,而且启动chrome打开网页,最后生成result.csv文件,文件内包含了爬取到的结果。
本节所有代码在:baidu_spider
爬虫的进阶就是须要与数据来源方斗智斗勇了,处理包括但不限于如下问题:
- IP被封禁
- 访问次数受限制
- 爬取速度太慢
- 页面重定向
- 页面ajax生成内容
- 页面内容由复杂的javascript生成
- etc.