引言
1.分布式爬虫框架:Nutch
2.Java单机爬虫框架:Crawler4j, WebMagic, WebCollector、Heritrix
3.python单机爬虫框架:scrapy、pyspider
使用python开发的爬虫框架最大的特点是开发效率非常高,做相同的事情,代码量要远少于使用Java开发。缺点也比较明显,如果对python不熟悉的情况下,代码调试的时间会耗费掉编码时省下来的时间,甚至会浪费得更多,在爬取业务非常复杂的情况下,会花掉更多的调试时间。
如果你想学习Python可以来这个群,首先是四七二,中间是三零九,最后是二六一,里面有大量的学习资料可以下载
总结下各个爬虫框架的特点:
语言 | 插件 | 上手难度 | 支持分布式 | 支持JS页面抓取 | 特点 | |
---|---|---|---|---|---|---|
Nutch | Java | 支持,开发复杂 | 高 | 支持 | 不支持 | 专门为搜索引擎设计 |
Crawler4j | Java | 不支持 | 低 | 不支持 | 不支持 | 简单 |
WebMagic | Java | 支持 | 低 | 不支持 | 不支持 | scrapy的Java版本 |
WebCollector | Java | 支持 | 低 | 不支持 | 支持 | 内置selenium |
Heritrix | Java | 支持 | 低 | 不支持 | 不支持 | 扩展性较好 |
scrapy | Java | 支持 | 低 | 扩展可支持 | 不支持 | 扩展性强 |
pyspider | Java | 支持 | 低 | 支持 | 支持 | 强大的爬虫管理和监控 |
1. URL管理,URL去重
2. 多线程抓取,线程池管理
3. 代理
4. 指定cookie
5. 集成网页解析器
6. 广度遍历或者深度遍历抓取
1. 减少开发量,并快速的看到结果
2. 垂直领域的精确抓取,具有明确的抓取对象,需要格式化抽取数据
3. 指定ajax请求抓取,或有抓取有限的url请求数据
4. 不作为持续集成的系统,仅需要快速收集数据
1. 多线程抓取的作用是提高抓取效率,但是现在主流的搜索平台,在关键数据上都做了防抓取的工作,过快的抓取频率很容易导致当前IP的流量被视为异常流量,最坏的结果是IP被列入网站的黑名单,被限流或禁止访问一段时间。
2. 在进行精确数据抓取时,URL去重的作用并不大,甚至不需要。
3. 增量抓取是个很实用的功能,对于大规模的数据抓取很有必要,因为在数据抓取的过程中很可能出现异常,或者某些原因需要暂停抓取过程,导致某些数据没有成功获取,增量抓取机制能够很好的支持在特殊情况下的数据抓取延续性。
4. 监控,大型数据抓取系统必不可少的一个功能。
1. 发起http请求
2. html解析
3. json解析
import urllib2
import json
header = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36','Content-Type':'application/json'}
data = json.dumps({"userName":"wenbin", "password":"passwd"})
request = urllib2.Request(loginUrl, None, header)
response = urllib2.urlopen(request)
data = response.read()
response.close()
import urllib2
import json
import cookielib
header = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36','Content-Type':'application/json}
loginUrl = "${loginUrl}"
data = json.dumps({"userName":"wenbin", "password":"passwd"})
cookieFileName = 'cookie.txt'
# set cookie to request
cookie = cookielib.MozillaCookieJar(cookieFileName)
handler = urllib2.HTTPCookieProcessor(cookie)
opener = urllib2.build_opener(handler)
request = urllib2.Request(loginUrl, data, header)
response = opener.open(request)
# save the cookie
cookie.save(ignore_discard=True, ignore_expires=True)
response.close()
dataUrl = "${dataUrl}"
request = urllib2.Request(dataUrl, None, header)
data = response.read()
response.close()
cookie = cookielib.MozillaCookieJar()
# get cookie from file
cookie.load('cookie.txt', ignore_discard=True, ignore_expires=True)
handler = urllib2.HTTPCookieProcessor(cookie)
opener = urllib2.build_opener(handler)
request = urllib2.Request(url, None, header)
response = opener.open(request)
data = response.read()
response.close()
data = "<html><h2 class="total fl"><span>100</span></h2><lu><li class="clear xiaoquListItem"><div class="title"><a href="www.demo.com/1/2/3">高大上小区</a></div></li><li class="clear xiaoquListItem"><div class="title"><a href="www.demo.com/1/2/3">高大上小区</a></div></li><li class="clear xiaoquListItem"><div class="title"><a href="www.demo.com/1/2/3">高大上小区</a></div></li></lu></html>"
# load html content
soup = BeautifulSoup(data, "html.parser")
# find the first <h2> with class=total fl
totalCount = soup.find('h2', attrs={'class': 'total fl'}).span.contents[0]
# find all <li> with class=clear xiaoquListItem
xiaoquTag = soup.find_all("li", attrs={'class': 'clear xiaoquListItem'})
pageSize = len(xiaoquTag)
for tag in xiaoquTag:
# find all <div> with class=title belong to tag
titleSet = tag.findAll("div", attrs={'class': 'title'})
for title in titleSet:
xiaoquUrl = title.a['href']
xiaoquId = str(xiaoquUrl).split('/')[4]
xiaoquName = title.a.contents[0]
xiaoquList.append([xiaoquId,xiaoquName,xiaoquUrl])
print xiaoquList
import json
jstr = '{"demoName":"demo","version":1}'
jObject = json.loads(json_string)
print jObject['version']
object={"demoName":"demo","version":1,"cont":[1,2]}
print json.dumps(object)
from selenium import webdriver
import os
from bs4 import BeautifulSoup
driverDir = "${dirvierDir}"
os.environ["webdriver.phantomjs.driver"] = driverDir
driver = webdriver.PhantomJS(driverDir)
url = '${url}'
driver.get(url)
data = self.driver.page_source
print data
soup = BeautifulSoup(data, "html.parser")
driver.close()
1. 控制对目标网站的抓取速度,如果仅仅是需要收集数据,而不要求数据的非常高的实时性,建议将访问频率控制到正常浏览的水平。
2. 具有生命周期的管控,数据收集完成后,需要停止爬虫的工作。
3. 健壮性,需要保证爬虫程序的健壮性,能够容忍坏的HTML、奇怪的服务器行为,不会因此而程序中断。
4. 可扩展性,通用功能组件化,便于复用,也便于修改。
5. 适当的监控,留下关键的抓取记录,便于异常恢复和抓取进度监控。
6. 具有一定的‘反爬虫’抗性