爬虫进阶,房比她要好买便宜二100000

ca88会员登录中心 21
ca88会员登录中心

1、Python基础

Python是一种面向对象、解释型自由语言,语法简洁清晰、基础代码库丰富,覆盖网络、文件、GUI、数据库、文本等领域。并能和其他主流语言沟通协助制作。Python主要分为Cpython、Jpython、IronPython、PyPy等。解释型语言可移植行好,但是运行速度不及编译型语言,其次解释型语言源码无法像编译型那样编译成二进制串加密。

ca88会员登录中心 1

 

ca88会员登录中心 2

目录:

  • Python网络爬虫(一)-
    入门基础
  • Python网络爬虫(二)-
    urllib爬虫案例
  • Python网络爬虫(三)-
    爬虫进阶
  • Python网络爬虫(四)-
    XPath
  • Python网络爬虫(五)- Requests和Beautiful
    Soup
  • Python网络爬虫(六)-
    Scrapy框架
  • Python网络爬虫(七)-
    深度爬虫CrawlSpider
  • Python网络爬虫(八) –
    利用有道词典实现一个简单翻译程序

1.1.2 Linux

安装Python3.x.x,通过pip安装需要的第三方库。

 

1.爬虫进阶cookielib

  • Python入门网络爬虫之精华版:详细讲解了Python学习网络爬虫。
  • 为了进行高效的抓取有用的数据,并且减少冗余数据的存储,后续需要使用正则表达式来进行对爬取数据中特定内容的存储。
  • urllib2 默认会使用环境变量 http_proxy 来设置 HTTP
    Proxy。假如一个网站它会检测某一段时间某个IP
    的访问次数,如果访问次数过多,它会禁止你的访问。可以设置代理IP来进行爬虫,具体见代码操作(四)
  • 当你获取一个URL你使用一个opener。在
    Python网络爬虫(二)-
    urllib爬虫案例中,我们都是使用的默认的opener,也就是urlopen。它是一个特殊的opener,可以理解成opener的一个特殊实例,传入的参数仅仅是urldatatimeout
  • Cookie,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)

    • cookielib模块的主要作用是提供可存储cookie的对象,以便于与urllib2模块配合使用来访问Internet资源。Cookielib模块非常强大,我们可以利用本模块的CookieJar类的对象来捕获cookie并在后续连接请求时重新发送,比如可以实现模拟登录功能。该模块主要的对象有CookieJarFileCookieJarMozillaCookieJarLWPCookieJar

    • 如果我们需要用到Cookie,只用这个opener是不能达到目的的,所以我们需要创建更一般的opener来实现对Cookie的设置。

1)获取Cookie,并保存到CookieJar()对象中

# urllib2_cookielibtest1.py

import urllib2
import cookielib

# 构建一个CookieJar对象实例来保存cookie
cookiejar = cookielib.CookieJar()

# 使用HTTPCookieProcessor()来创建cookie处理器对象,参数为CookieJar()对象
handler=urllib2.HTTPCookieProcessor(cookiejar)

# 通过 build_opener() 来构建opener
opener = urllib2.build_opener(handler)

# 4. 以get方法访问页面,访问之后会自动保存cookie到cookiejar中
opener.open("http://www.baidu.com")

## 可以按标准格式将保存的Cookie打印出来
cookieStr = ""
for item in cookiejar:
    cookieStr = cookieStr + item.name + "=" + item.value + ";"

## 舍去最后一位的分号
print cookieStr[:-1]

2) 访问网站获得cookie,并把获得的cookie保存在cookie文件中

# urllib2_cookielibtest2.py

import cookielib
import urllib2

# 保存cookie的本地磁盘文件名
filename = 'cookie.txt'

# 声明一个MozillaCookieJar(有save实现)对象实例来保存cookie,之后写入文件
cookiejar = cookielib.MozillaCookieJar(filename)

# 使用HTTPCookieProcessor()来创建cookie处理器对象,参数为CookieJar()对象
handler = urllib2.HTTPCookieProcessor(cookiejar)

# 通过 build_opener() 来构建opener
opener = urllib2.build_opener(handler)

# 创建一个请求,原理同urllib2的urlopen
response = opener.open("http://www.baidu.com")

# 保存cookie到本地文件
cookiejar.save()

3)从文件中获取cookies,做为请求的一部分去访问

# urllib2_cookielibtest2.py

import cookielib
import urllib2

# 创建MozillaCookieJar(有load实现)实例对象
cookiejar = cookielib.MozillaCookieJar()

# 从文件中读取cookie内容到变量
cookie.load('cookie.txt')

# 使用HTTPCookieProcessor()来创建cookie处理器对象,参数为CookieJar()对象
handler = urllib2.HTTPCookieProcessor(cookiejar)

# 通过 build_opener() 来构建opener
opener = urllib2.build_opener(handler)

response = opener.open("http://www.baidu.com")
  • urllib
    模块方法。

  • urllib2 的异常错误处理

    • URLError

import urllib2

requset = urllib2.Request('http://www.ajkfhafwjqh.com')

try:
    urllib2.urlopen(request, timeout=5)
except urllib2.URLError, err:
    print err
  • HTTPError

HTTPError是URLError的子类,我们发出一个请求时,服务器上都会对应一个response应答对象,其中它包含一个数字”响应状态码”。

如果urlopen或opener.open不能处理的,会产生一个HTTPError,对应相应的状态码,HTTP状态码表示HTTP协议所返回的响应的状态。

注意,urllib2可以为我们处理重定向的页面(也就是3开头的响应码),100-299范围的号码表示成功,所以我们只能看到400-599的错误号码。

import urllib2

requset = urllib2.Request('http://blog.baidu.com/itcast')

try:
    urllib2.urlopen(requset)
except urllib2.HTTPError, err:
    print err.code
    print err
  • 改进版

import urllib2

requset = urllib2.Request('http://blog.baidu.com/itcast')

try:
    urllib2.urlopen(requset)

except urllib2.HTTPError, err:
    print err.code

except urllib2.URLError, err:
    print err

else:
    print "Good Job"

这样我们就可以做到,首先捕获子类的异常,如果子类捕获不到,那么可以捕获父类的异常。

1.2 Python库

Python为开发者提供丰富代码库,开发者从不会从零开始开发,基础功能基本已经有现成的成熟的框架或库支持,因此大幅度的提升开发者的开发效率和提高代码健壮性。

ca88会员登录中心 3

 

Python很容易学!小编有弄一个交流,互问互答,资源共享的交流学习基地,如果你也是Python的学习者或者大牛都欢迎你来!㪊:548+377+875!一起
学习共同进步!

ca88会员登录中心 4

 

深圳房价飞涨,但也阻挡不了祖国各地人民来深圳买房的欲望。深圳房价动辄几百万,程序猿这种动物想在深圳安居压力山大。所以买房必然是人生一重大决定,必须货比三家。当前各种房产中介,各种开发商,各种楼盘。信息多到我们无法掌握。因此程序猿就需要利用专业的优势通过一些方式获取有效数据,分析筛选最优秀的房源。

Python学习网络爬虫主要分3个大的版块:抓取,分析,存储

2.具体代码操作

2.1.1 Python教你买房维度指标体系

Python教你买房首先我们需要确定我们购房时最关注的维度体系和指标体系。关注主要维度和关键指标体系如图所示:

ca88会员登录中心 5

 

Python教你买房,分为数据爬虫和大数据分析。首先通过爬虫方式获取到深圳房产交易网成功交易量和交易价格并得出深圳房价的趋势,得到最合适的购房时间段,确认最佳的上车时间。然后爬取链家网数据并按用户关注维度深度分析帅选得出适宜的房子,做好一切上车的准备。

ca88会员登录中心 6

 

当我们在浏览器中输入一个url后回车,后台会发生什么?

代码操作(一) 自定义数据请求方式

# -*- coding:utf-8 -*-
import urllib2,urllib

#创建一个HTPP请求对象
http_handler = urllib2.HTTPHandler()

# 构建一个HTTPHandler 处理器对象,支持处理HTTPS请求
http_handler = urllib2.HTTPSHandler()

#创建一个打开方式对象
opener = urllib2.build_opener(http_handler)
#通过自定义的打开方式,
response = opener.open('https://www.baidu.com')
#读取响应对象中的数据
print response.read()

爬取结果

注解:这里使用urllib2.HTTPHandler()访问https网页得到的html代码。

这种方式发送请求得到的结果,和使用urllib2.urlopen()发送HTTP/HTTPS请求得到的结果是一样的。

如果在 HTTPHandler()增加 debuglevel=1参数,还会将 Debug Log
打开,这样程序在执行的时候,会把收包和发包的报头在屏幕上自动打印出来,方便调试,有时可以省去抓包的工作。

# 仅需要修改的代码部分:

# 构建一个HTTPHandler 处理器对象,支持处理HTTP请求,同时开启Debug Log,debuglevel 值默认 0
http_handler = urllib2.HTTPHandler(debuglevel=1)

# 构建一个HTTPHSandler 处理器对象,支持处理HTTPS请求,同时开启Debug Log,debuglevel 值默认 0
https_handler = urllib2.HTTPSHandler(debuglevel=1)

2.1.2 Python教你买房框架

Python教你买房框架,主要分为5块,分别为主程序模块、代理IP模块、地图服务模块、可视化服务模块、目标页面模块等。主程序为首先启动代理IP模块,抓取带来IP并通过测试可用代理IP存入到代理池,定时线程定时清洗带来并把无效的带来IP剔除出代理池,代理IP模块并提供外部API获取代理IP。主程序通过代理服务访问并抓取外部网页的有效信息并在主程序模块理解习HTML并写入到本地文件。主程序会调用地图服务获取经纬度信息,并绘制热力图等。同时间可视化模块定时读取文件并生成可视化图形报表供业务侧分析使用。

ca88会员登录中心 7

 

1、主服务模块

主程块通过Api提供给前端用户登录和获取用户交互输入,通过参数解析获取得到用户的需求组装请求,获取代理IP转发请求到目标地址获取目标数据,返回数据通过html解析得到有效数据写入到文件地图服务和可视化服务生产友好的图形报表,辅佐得出Python教你买房的数据支撑。

2、IP代理服务模块

#!/usr/bin/env python3# -*- coding: utf-8 -*-# function:定时抓取免费代理IP,并检查可用性,可用proxy存入数据库供业务方调用获取# Author:elideng# date: 2017-11-11import requestsfrom bs4 import BeautifulSoupimport tracebackimport pymysqlimport threadingimport time'''
*@Function【爬取IpProxy】
*@Request: 请求 [in]
* param1 int iReqGetNum: 请求获取代理量
*@Response:响应 [out]
* param1 int iFinalGetNum: 最终获取代理量
*@Return:返回值 int : 0(成功) 其它失败
'''def GrabIpProxy():
 arrIpList = []
 User_Agent = 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0'
 header = {}
 header['User-Agent'] = User_Agent #url = 'http://www.xicidaili.com/nn/1'
 url = 'http://www.baidu.com'
 res = requests.get(url, headers=header) if res.status_code == 200:
 info = {}
 soup = BeautifulSoup(res.text, 'lxml')
 ips = soup.findAll('tr') for x in range(1, len(ips)):
 ip = ips[x]
 tds = ip.findAll("td")
 ip_port = tds[1].contents[0] + ":" + tds[2].contents[0]
 arrIpList.append(ip_port) #后续加上代理可用校验,非可用踢出代理池
 #print(ip_port)
 #计算列表量
 return arrIpList'''
*@Function【测试ipProxy是否可用】
*@Request: 请求 [in]
* param1 String desUrl: 测试目的地址
* param2 String ipProxy:代理IP端口
* param3 int iTimeout:超时时间
* param4 String feature:目的地址特征
*@Response:响应 [out]
* param1 int iFinalGetNum: 最终获取代理量
*@Return:返回值 :成功返回代理Proxy 失败返回空
'''def checkProxyIP(desUrl, ipProxy, iTimeout=3, feature=""): #确认带来iPaddress 2秒内能否
 #desUrl = 'http://www.baidu.com'
 header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0'}
 proxies = {'http': 'http://' + ipProxy} #组装代理
 res = None # 声明
 exMsg = None
 try: #res = requests.get(url=desUrl, headers=header, proxies=proxies, timeout=iTimeout)
 res = requests.get(desUrl, proxies=proxies, timeout=iTimeout) # 代理方式请求,防止反爬虫
 soup = BeautifulSoup(res.text, 'lxml') #feature=""
 #print(soup.findAll(feature))
 except:
 exMsg = '* ' + traceback.format_exc() if exMsg: return -1
 if res.status_code != 200: return -1
 if res.text.find(feature) < 0: return -1
 return 0#更新代理池IPdef updateProxy(ipProxy, vaildFlag="N"):
 smysql = pymysql.connect(host='127.0.0.1', user='root', passwd='elideng', db='test')
 cursor = smysql.cursor() try:
 cursor.execute('update t_proxy set FvaildFlag="%s" where Fproxy="%s" limit 1' % (ipProxy, vaildFlag))
 smysql.commit() #提交执行
 except:
 smysql.rollback()
 smysql.close() return 0#新增代理池IPdef insertProxy(ipProxy, vaildFlag="Y"):
 smysql = pymysql.connect(host='127.0.0.1', user='root', passwd='elideng', db='test')
 cursor = smysql.cursor() try:
 cursor.execute('insert into t_proxy values("%s", "%s", now(), now())' % (ipProxy, vaildFlag))
 smysql.commit() #提交执行
 except:
 smysql.rollback()
 smysql.close() return 0#获取Proxydef getProxy(proxyNum):
 smysql = pymysql.connect(host='127.0.0.1', user='root', passwd='elideng', db='test')
 cursor = smysql.cursor()
 proxyList=[] try: if proxyNum == -1:
 cursor.execute('select Fproxy from t_proxy where FvaildFlag='Y'') else:
 cursor.execute('select Fproxy from t_proxy where FvaildFlag='Y' limit %s' % (proxyNum))
 results = cursor.fetchall() for row in results:
 proxyList.append(row[0]) except: # Rollback in case there is any error
 smysql.rollback()
 smysql.close() return proxyListdef CheckIpProxyTimer():
 arrIpList = []
 arrIpList = getProxy(-1) #获取代理池全量有效代理IP
 #测试地址
 #feature = 'xxx' #目标网页的特征码, 暂时不启用
 desUrl = "http://www.baidu.com"
 for ipProxy in arrIpList:
 iRes = checkProxyIP(desUrl, ipProxy) if iRes: #Proxy验证通过
 setProxy(ipProxy, "Y") else:
 setProxy(ipProxy, "N") #失效无效代理if __name__ == '__main__': #0、爬取免费代理IP
 GrabIpProxy() #1、启动定时线程,定时测试并清洗数据库代理IP
 timer = threading.Timer(3600, CheckIpProxyTimer)
 timer.start() #2、设置定时器失效时间
 time.sleep(5)
 timer.cancel() #5秒后停止定时器,程序可一直执行

3、地图服务模块

#!/usr/bin/env python3# -*- coding: utf-8 -*-# Author:elideng# date: 2017-11-08from urllib.request import urlopen, quoteimport jsonfrom bs4 import BeautifulSoupimport os#根据地址获取经纬度def getlnglat(address):
 url = 'http://api.map.baidu.com/geocoder/v2/'
 output = 'json'
 ak = 'ATzU2rqfrFoQcImvG9mvGm9bxchxjLYL'
 add = quote(address) #由于本文地址变量为中文,为防止乱码,先用quote进行编码
 uri = url + '?' + 'address=' + add + '&output=' + output + '&ak=' + ak
 req = urlopen(uri)
 res = req.read().decode()
 temp = json.loads(res)
 lat=0
 lng=0
 if 0 == temp['status']:
 lat=temp['result']['location']['lat']
 lng=temp['result']['location']['lng'] return lat,lng#根据两个经纬度计算距离def getPlaceDistance():
 return 0#根据两个地点计算各类交通时间def getPlaceTime():
 return 0def drawHeatChart(date):
 file = open("data.js", "a+") #data.js
 file.seek(3) # 定位到第0行
 file.writelines(date) #写入源数据到热力图源文件
 file.close() return 0if __name__ == '__main__':
 HeatChartSrcFile = input('输入热力图源文件:') #data.js
 drawHeatChart(HeatChartSrcFile)

<!DOCTYPE html><html><head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
 <script
 src="https://code.jquery.com/jquery-3.2.1.min.js"
 integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4="
 crossorigin="anonymous"></script>
 <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=DD279b2a90afdf0ae7a3796787a0742e"></script>
 <script type="text/javascript" src="http://api.map.baidu.com/library/Heatmap/2.0/src/Heatmap_min.js"></script>
 <script type="text/javascript" src="./data.js"></script>
 <title>热力图功能示例</title>
 <style type="text/css">  ul,li{list-style: none;margin:0;padding:0;float:left;}  html{height:100%}  body{height:100%;margin:0px;padding:0px;font-family:"微软雅黑";}  #container{height:500px;width:100%;}  #r-result{width:100%;} </style></head><body>
 <div id="container"></div>
 <div id="r-result">
  <input type="button" onclick="openHeatmap();" value="显示热力图"/><input type="button" onclick="closeHeatmap();" value="关闭热力图"/>
 </div></body><script type="text/javascript">
 var map = new BMap.Map("container"); // 创建地图实例
 var point = new BMap.Point(114.061087, 22.528578); //自定义地图中点
 map.centerAndZoom(point, 12); // 初始化地图,设置中心点坐标和地图级别
 map.enableScrollWheelZoom(); // 允许滚轮缩放
 if(!isSupportCanvas()){
  alert('热力图目前只支持有canvas支持的浏览器,您所使用的浏览器不能使用热力图功能~')
 }
 heatmapOverlay = new BMapLib.HeatmapOverlay({"radius":20});
 map.addOverlay(heatmapOverlay); var param = {data:window.points,max:100}; //读取data.js热力源数据并生成热力图
 console.log(param);
 heatmapOverlay.setDataSet(param); //是否显示热力图
 function openHeatmap(){
 heatmapOverlay.show();
 } function closeHeatmap(){
 heatmapOverlay.hide();
 setTimeout(function(){
 location.reload();
 }, 10000)
 }
 closeHeatmap(); function setGradient(){  var gradient = {};  var colors = document.querySelectorAll("input[type='color']");
  colors = [].slice.call(colors,0);
  colors.forEach(function(ele){
   gradient[ele.getAttribute("data-key")] = ele.value;
  });
 heatmapOverlay.setOptions({"gradient":gradient});
 } //判断浏览区是否支持canvas
 function isSupportCanvas(){ var elem = document.createElement('canvas'); return !!(elem.getContext && elem.getContext('2d'));
 }</script></html>

4、可视化模块

#!/usr/bin/env python3# -*- coding: utf-8 -*-# function:可视化服务# Author:elideng# date: 2017-11-05import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport plotlyimport plotly.plotly as pyimport plotly.graph_objs as go
plotly.tools.set_credentials_file(username='elideng', api_key='tsc3809760')#雷达图显示房屋关注指标def drawRadarMap(chartName, arrLables, arrData, labelNum):
 #数据校验
 if labelNum < 0 or labelNum >10: return -1
 if len(arrLables) != labelNum or len(arrData) != labelNum: return -2
 #=======自己设置开始============
 #标签
 labels = np.array(arrLables) #数据
 data = np.array(arrData) #========自己设置结束============
 angles = np.linspace(0, 2*np.pi, labelNum, endpoint=False)
 data = np.concatenate((data, [data[0]])) # 闭合
 angles = np.concatenate((angles, [angles[0]])) # 闭合
 fig = plt.figure()
 ax = fig.add_subplot(111, polar=True) # polar参数!!
 ax.plot(angles, data, 'bo-', linewidth=2) # 画线
 ax.fill(angles, data, facecolor='r', alpha=0.25)# 填充
 ax.set_thetagrids(angles * 180/np.pi, labels, fontproperties="SimHei")
 ax.set_title(chartName, va='bottom', fontproperties="SimHei")
 ax.set_rlim(0,10)
 ax.grid(True)
 plt.show()#皮尔逊作图def drawPearson():
 return 0

简单来说这段过程发生了以下四个步骤:

代码操作(二) 自定义数据请求方式

# -*- coding:utf-8 -*-
import urllib,urllib2

#准备数据
ftp_server = '192.168.1.100'
username = 'root'
password = '123'

#创建一个密码管理器对象
pass_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()

#增加一个管理服务器
pass_mgr.add_password(None,ftp_server,username,password)

#创建一个web验证服务器
http_auth_handler = urllib2.HTTPBasicAuthHandler(pass_mgr)

#构建一个请求对象
request = urllib2.Request('http://image.baidu.com')

#创建自定义打开方式对象【开锁人】
opener = urllib2.build_opener(http_auth_handler)

#发送请求,获取服务器的响应对象
response = opener.open(request)

# 获取响应中的数据
content = response.read()

#处理相关数据

2.1.3 Python教你买房系列

1、网页观察

首先确定爬取链家网深圳房源,确定起始地址
log勾选,清空Filter后刷新网页,观察网页html代码。

2、网页爬取

通过Python3的requests库提供的HTTP请求Get/Post通用方法模拟浏览器请求生成所有符合规则的URL放入到队列,并循环请求符合要求的房源信息。请求响应html通过BeautifulSoup解析html,并通过find_all配合正则表达式提取到html有效数据并写入到文件待分析。

3、多线程

爬虫最终目标就是爬取到更多符合用户需求的数据,如果单线程执行,抓取效率有限,因此爬虫需要加上多线程机制。多线程的实现方式有多种,如thread,threading,multithreading,其中thread偏底层,threading对thread进行了一定封装。Python实现多线程的方式有两种函数或类包装。

 #多线程方式
 for i in generate_allurl(user_in_nub, user_in_city): #获取某城市
 print(i) for url in get_allurl(i):
 my_thread = threading.Thread(target=main, args=(url, arrIPList))
 my_thread.start() print(url)
 my_thread.join() print("current has %d threads" % (threading.activeCount() - 1)) #当前存活线程
 #线程池方式
 pool.map(main, [url for url in get_allurl(i)])

4、Headers设置

为避开反爬虫策略,后端请求需要模拟用户正常用户从浏览器请求,因此需要添加请求头。设置方式如下:

header = {'Accept': '*/*', 'Accept-Language': 'en-US,en;q=0.8', 'Cache-Control': 'max-age=0', 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36', 'Connection': 'keep-alive', 'Referer': 'http://www.baidu.com/'}
res = requests.get(url, headers=header)

5、Session设置

6、IP代理池

爬虫出现就诞生了反爬虫,反爬虫的出现就催生了反反爬虫,哲学家黑格尔说过存在就是合理。因此很多技术就是在抗衡中逐渐成长。链家网是有反爬虫IP封锁机制,为了防止反爬虫链接网限制爬取到更多数据样本帮助与分析。因此采用IP代理池的方式,每次请求都随机获取IP和端口访问外部网站。获取IP代理池的方式有付费的和免费的方式可自行网上抓取并分析。

proxies={"http":"http://10.14.36.109:8080"}res = requests.get(url, headers=header, proxies=proxies)

7、监控

ca88会员登录中心,爬虫抓取是一个耗时较长的工程,因此需要添加监控,定时上报抓取进度到业务方,确认整个爬虫程序是否正常执行。//TODO

ca88会员登录中心 8

代码操作(三)从ftp服务器爬取数据

# -*- coding:utf-8 -*-
import urllib,urllib2

#准备数据
ftp_server = '192.168.1.100'
username = 'root'
password = '123'

#创建一个密码管理器对象
pass_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()

#增加一个管理服务器
pass_mgr.add_password(None,ftp_server,username,password)

#创建一个web验证服务器
http_auth_handler = urllib2.HTTPBasicAuthHandler(pass_mgr)

#构建一个请求对象
request = urllib2.Request('http://image.baidu.com')

#创建自定义打开方式对象【开锁人】
opener = urllib2.build_opener(http_auth_handler)

#发送请求,获取服务器的响应对象
response = opener.open(request)

# 获取响应中的数据
content = response.read()

#处理相关数据
print content

2.2数据分析 //TODO

大数据时代的网络爬虫爬取到有效信息,需要经过反复清洗、加工、统计、分析、建模等处理方法。数据分析是整合有效信息并详细研究和概括形成结论的过程。在实用中,数据分析可帮助人们作出判断,以便采取适当行动。

 

代码操作(四) 自定义数据请求方式——代理请求

# -*- coding:utf-8 -*-
import urllib
import urllib2

#创建一个HTTP处理器对象
#使用免费的代理进行处理器的创建
proxy_handler = urllib2.ProxyHandler({'http':'110.50.85.68:80'})

#如果是付费的代理,输入自己的账号密码即可
# proxy_handler = urllib2.ProxyHandler({'http':'username:password@175.172.212.178:80'})

# 创建一个请求发送对象
opener = urllib2.build_opener(proxy_handler)

#创建请求对象
request = urllib2.Request(r'http://www.baidu.com')

#发送请求,获取服务器返回的响应对象
response = opener.open(request)

#获取数据
print response.read()

2.2.1 深圳购房词云分析

根据链家爬取样3199条待售房源,买卖二手房产我们最关系的参数指标词云图。如图所示我们最关注的满五牛,户型方正等。在购房的的时候我们可以按此词云图详细了解每个需要我们关注的参数指标,心有成竹。

ca88会员登录中心 9

 

#词云图def drawWordCloud(fileName):

d = path.dirname(__file__) # Read the whole text.

text = open(path.join(d, fileName), encoding=’utf-8′).read() # Generate
a word cloud image 中文必须指定本地中文编码

wordcloud = WordCloud(font_path=”C:WindowsFontssimsun.ttc”, width=2400,
height=1800).generate(text) # Display the generated image:

plt.imshow(wordcloud)

plt.axis(“off”) # lower max_font_size

wordcloud = WordCloud(max_font_size=40).generate(text)

plt.figure()

plt.imshow(wordcloud)

plt.axis(“off”)

plt.show()

网络爬虫要做的,简单来说,就是实现浏览器的功能。通过指定url,直接返回给用户所需要的数据,而不需要一步步人工去操纵浏览器获取。

代码操作(五) 爬取人人网个人中心数据,需要验证登陆

# -*- coding:utf-8 -*-
import urllib
import urllib2
import cookielib


#声明一个CookieJar对象实例来保存cookie
cookie = cookielib.CookieJar()

#利用urllib2库的HTTPCookieProcessor对象来创建cookie处理器
cookielib_handler = urllib2.HTTPCookieProcessor(cookie)

#创建一个请求打开方式
opener = urllib2.build_opener(cookielib_handler)

#构建请求对象 'http://www.renren.com/PLogin.do' 这个接口没有做反爬虫处理
url = 'http://www.renren.com/PLogin.do' #http://www.renren.com/SysHome.do,这个接口做了反爬虫处理
data = urllib.urlencode({'email':'用户名','password':'密码'})
request = urllib2.Request(url,data)

#发送请求
response = opener.open(request)

#获取数据
content = response.read()

print content

data数据从form表单name中获取

2.2.2 深圳房源维度分析

深圳房源按多维度分析成交量/成交价趋势和皮尔逊系数分析;放盘量和反叛价分析;房源内部参数(如2.1.1)量化分析,房源外部参数量化分析等方式。最终解释我们购房时比较关心问题如怎么买的心仪的好房,何时是买房最好的时机等。

ca88会员登录中心 10

 

抓取

这一步,你要明确要得到的内容是什么?是HTML源码,还是Json格式的字符串等。

  1. 最基本的抓取

抓取大多数情况属于get请求,Python中自带urllib及urllib2这两个模块,基本上能满足一般的页面抓取。另外,requests也是非常有用的包,与此类似的,还有httplib2等等。

ca88会员登录中心 11

 

此外,对于带有查询字段的url,get请求一般会将来请求的数据附在url之后,以?分割url和传输数据,多个参数用&连接。

ca88会员登录中心 12

 

  1. 对于登陆情况的处理

使用表单登陆

这种情况属于post请求,即先向服务器发送表单数据,服务器再将返回的cookie存入本地。

ca88会员登录中心 13

 

使用cookie登陆

ca88会员登录中心 14

 

代码操作(六) 爬取指定网页的图片保存至本地,这里写的函数是爬取游民星空每周壁纸精选

# -*- coding:utf-8 -*-
import urllib
import urllib2
import re

#定义函数,用于爬取对应的数据
def getHtml(url):
    page = urllib.urlopen(url)
    html = page.read()
    return html

#定义函数,进行爬虫的核心处理功能
def getImg(html):
    #使用正则表达式匹配想要保存的数据———图片
    reg = 'src="(.+?\.jpg)"'
    #将正则表达式编译成Pattern对象,
    imgre = re.compile(reg)
    imglist = re.findall(imgre, html)
    x = 0
    for imgurl in imglist:
        urllib.urlretrieve(imgurl, '%s.jpg' % x)
        x+=1
    return imglist

#主程序运行入口
if __name__ == '__main__':
    Html = raw_input('请输入想要爬取的网页链接:')

    html = getHtml(Html)
    getImg(html)

2.2.3 深圳房源数据模型

ca88会员登录中心 15

 

对于反爬虫机制的处理

使用代理

适用情况:限制IP地址情况,也可解决由于“频繁点击”而需要输入验证码登陆的情况。

ca88会员登录中心 16

 

注解: urllib 模块提供的 urlretrieve() 函数

urlretrieve(url, filename=None, reporthook=None, data=None)
  • 参数 finename
    指定了保存本地路径(如果参数未指定,urllib会生成一个临时文件保存数据。)
  • 参数 reporthook
    是一个回调函数,当连接上服务器、以及相应的数据块传输完毕时会触发该回调,我们可以利用这个回调函数来显示当前的下载进度。
  • 参数 data 指 post
    到服务器的数据,该方法返回一个包含两个元素的(filename,
    headers)元组,filename 表示保存到本地的路径,header
    表示服务器的响应头。
  • urllib2与urllib一些常用方法的比较

爬取的是游民星空壁纸精选

从本地文件可以看到爬取保存至本地20张图片

2.2.4 深圳房源均价热力模型

如图展示深圳深圳房源均价热力模型。//TODO 待分析

ca88会员登录中心 17

 

时间设置

适用情况:限制频率情况。

Requests,Urllib2都可以使用time库的sleep()函数:

import time

time.sleep(1)

2.2.5 深圳房源均价涨速热力模型

//TODO
确定涨速最快,最具投资价值的区域,数据来源官网深圳房地产信息系统:

伪装成浏览器,或者反“反盗链”

ca88会员登录中心 18

 

2.2.6 深圳房源成交量热力模型

//TODO

对于断线重连

ca88会员登录中心 19

 

2.2.7 深圳房源成交量热力模型

对于Ajax请求的处理

对于“加载更多”情况,使用Ajax来传输很多数据。

它的工作原理是:从网页的url加载网页的源代码之后,会在浏览器里执行JavaScript程序。

ca88会员登录中心 20

 

2.2.8 深圳房源成交量和成交价皮尔逊系数

//TODO
计算皮尔逊系数,确定量价比关系,确认深圳房源当前状态和预测接下来可能的情况(有价有市,有市无价,有价无市),判断当前是否改上车。

验证码识别

对于网站有验证码的情况,我们有三种办法:

  • 使用代理,更新IP。
  • 使用cookie登陆。
  • 验证码识别。

2.2.9 深圳房屋内部指数量化雷达图模型

深圳房屋雷达图分析,程序首先会爬取到海量深圳待售的房产信息,等级差=(最高值-最低值)/10的方式把均价,实际使用率,梯户比例,楼层,楼间距等指标划分10等分,然后用户输入自己心仪的房子,程序将计算改房子的指标在海量房产中的雷达位置,帮助用户快速了解心仪房产的参数配置。效果图如下:

ca88会员登录中心 21

 

#雷达图显示房屋关注指标def drawRadarMap(chartName, arrLables, arrData, labelNum):
 #数据校验
 if labelNum < 0 or labelNum >10: return -1
 if len(arrLables) != labelNum or len(arrData) != labelNum: return -2
 #=======自己设置开始============
 #标签
 labels = np.array(arrLables) #数据
 data = np.array(arrData) #========自己设置结束============
 angles = np.linspace(0, 2*np.pi, labelNum, endpoint=False)
 data = np.concatenate((data, [data[0]])) # 闭合
 angles = np.concatenate((angles, [angles[0]])) # 闭合
 fig = plt.figure()
 ax = fig.add_subplot(111, polar=True) # polar参数!!
 ax.plot(angles, data, 'bo-', linewidth=2) # 画线
 ax.fill(angles, data, facecolor='r', alpha=0.25)# 填充
 ax.set_thetagrids(angles * 180/np.pi, labels, fontproperties="SimHei")
 ax.set_title(chartName, va='bottom', fontproperties="SimHei")
 ax.set_rlim(0,10)
 ax.grid(True)
 plt.show()

爬取有两个需要注意的问题:

  • 如何监控一系列网站的更新情况,也就是说,如何进行增量式爬取?
  • 对于海量数据,如何实现分布式爬取?

2.2.10 深圳房屋外部指数量化雷达图模型

//TODO 量化外部指标参数(学位,地铁距离,公交具体,公园分布,商圈等)

所以,还不会Python的,想买房的,赶快来学习了!限时抢购哦!

分析

抓取之后就是对抓取的内容进行分析,你需要什么内容,就从中提炼出相关的内容来。

常见的分析工具有正则表达式,BeautifulSoup,lxml等等。

存储

分析出我们需要的内容之后,接下来就是存储了。

我们可以选择存入文本文件,也可以选择存入MySQL或MongoDB数据库等。

存储有两个需要注意的问题:

  • 如何进行网页去重?
  • 内容以什么形式存储?

作者:fireling

源自:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图