python抓取安居客小区数据的程序代码

 更新时间:2016年11月25日 15:34  点击:1941
抓取数据不管用什么编程语言几乎都是可以实现了,今天我们需要采集安居客的小区数据,下面我们来看一个python抓取安居客小区数据的程序代码了,希望下文能够对大家有帮助。

某功能需要一套城市所有小区的位置信息数据,一开始是使用的百度地图api来进行关键词搜索,勉强能用,但数据量非常少,还是有大量的社区/小区搜不到。
周末在家上网时发现安居客上直接就有每个城市的小区大全,欣喜若狂,于是就立即写了个爬虫试试。
以下贴代码,python2.7,lxml+request库。

#coding=utf-8
#author : zx
#date   : 2015/07/27
import requests
import MySQLdb
import time
import string
import random
from lxml import etree
#ua头信息 get时可以随机使用
headers = [
    { "User-Agent":"Mozilla/5.0 (Linux; U; Android 4.1; en-us; GT-N7100 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30"},
    { "User-Agent":"Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 520)"},
    { "User-Agent":"Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.0.9.2372 Mobile Safari/537.10+"},
    { "User-Agent":"Mozilla/5.0 (Linux; Android 4.4.2; GT-I9505 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Version/1.5 Chrome/28.0.1500.94 Mobile Safari/537.36"}
]
#城市入口页面
#我只抓的青岛本地
#其它城市或全国城市可通过这个页面抓取城市列表http://m.anjuke.com/cityList
url = 'http://m.anjuke.com/qd/xiaoqu/'
req = requests.get(url)
cookie = req.cookies.get_dict()
#链接数据库
conn = MySQLdb.connect('localhost', '*****', '******', '***', charset='utf8')
cursor = conn.cursor()
sql = "insert into xiaoqu (name, lat, lng, address, district) values (%s, %s, %s, %s, %s)"
sql_v = [] 
page = etree.HTML(req.text)
districtHTML = page.xpath(u"//div[@class='listcont cont_hei']")[0]
#采集目标城市的各行政区域url
#当然如果不想区分行政区可以直接抓“全部” 即上面url中的所有小区及分页
districtUrl = {}
i = 0
for a in districtHTML:
    if i==0:
        i = 1
        continue
    districtUrl[a.text] = a.get('href')
#开始采集
total_all = 0
for k,u in districtUrl.items():
    p = 1 #分页
    while True:
        header_i = random.randint(0, len(headers)-1)
        url_p = u.rstrip('/') + '-p' + str(p)
        r = requests.get(url_p, cookies=cookie, headers=headers[header_i])
        page = etree.HTML(r.text) #这里转换大小写要按情况...
        communitysUrlDiv = page.xpath(u"//div[@class='items']")[0]
        total = len(communitysUrlDiv)
        i = 0
        for a in communitysUrlDiv:
            i+=1
            r = requests.get(a.get('href'), cookies=cookie, headers=headers[header_i])
            #抓取时发现有少量404页会直接导致程序报错退出- -!
            #唉 说明代码写的还不够健壮啊
            #加了if判断和try, 错误时可以跳过或做一些简单处理和调试...
            if r.status_code == 404:
                continue
            page = etree.HTML(r.text)
            try:
                name = page.xpath(u"//h1[@class='f1']")[0].text
            except:
                print a.get('href')
                print r.text
                raw_input()
            #有少量小区未设置经纬度信息
            #只能得到它的地址了
            try:
                latlng = page.xpath(u"//a[@class='comm_map']")[0]
                lat = latlng.get('lat')
                lng = latlng.get('lng')
                address = latlng.get('address')
            except:
                lat = ''
                lng = ''
                address = page.xpath(u"//span[@class='rightArea']/em")[0].text
            sql_v.append((name, lat, lng, address, k))
            print "\r\r\r",
            print u"正在下载 %s 的数据,第 %d 页,共 %d 条,当前:".encode('gbk') %(k.encode('gbk'),p, total) + string.rjust(str(i),3).encode('gbk'),
            time.sleep(0.5) #每次抓取停顿
        #执行插入数据库
        cursor.executemany(sql, sql_v)
        sql_v = []
        time.sleep(5)  #每页完成后停顿
        total_all += total
        print ''
        print u"成功入库 %d 条数据,总数 %d".encode('gbk') % (total, total_all)
        if total < 500:
            break
        else:
            p += 1
#及时关闭数据库 做个好孩子 任务完成~
cursor.close()
conn.close()
print u'所有数据采集完成! 共 %d 条数据'.encode('gbk') % (total_all)
raw_input()


注释我觉得已经写的很详细了,在cmd中显示,字符串当然要转一下码。
以下是运行状态和得到的数据截图。

 

python抓取安居客小区数据

安居客小区数据库

 

下文小编为各位来介绍一篇关于PHP ASCII码与字符串的相互转换的例子,希望这个例子能够对各位有帮助。
<?php
class ascii {
    /**
     * 将ascii码转为字符串
     * @param type $str  要解码的字符串
     * @param type $prefix  前缀,默认:&#
     * @return type
     */
    function decode($str, $prefix="&#") {
        $str = str_replace($prefix, "", $str);
        $a = explode(";", $str);
        foreach ($a as $dec) {
            if ($dec < 128) {
                $utf .= chr($dec);
            } else if ($dec < 2048) {
                $utf .= chr(192 + (($dec - ($dec % 64)) / 64));
                $utf .= chr(128 + ($dec % 64));
            } else {
                $utf .= chr(224 + (($dec - ($dec % 4096)) / 4096));
                $utf .= chr(128 + ((($dec % 4096) - ($dec % 64)) / 64));
                $utf .= chr(128 + ($dec % 64));
            }
        }
        return $utf;
    }
    /**
     * 将字符串转换为ascii码
     * @param type $c 要编码的字符串
     * @param type $prefix  前缀,默认:&#
     * @return string
     */
    function encode($c, $prefix="&#") {
        $len = strlen($c);
        $a = 0;
        while ($a < $len) {
            $ud = 0;
            if (ord($c{$a}) >= 0 && ord($c{$a}) <= 127) {
                $ud = ord($c{$a});
                $a += 1;
            } else if (ord($c{$a}) >= 192 && ord($c{$a}) <= 223) {
                $ud = (ord($c{$a}) - 192) * 64 + (ord($c{$a + 1}) - 128);
                $a += 2;
            } else if (ord($c{$a}) >= 224 && ord($c{$a}) <= 239) {
                $ud = (ord($c{$a}) - 224) * 4096 + (ord($c{$a + 1}) - 128) * 64 + (ord($c{$a + 2}) - 128);
                $a += 3;
            } else if (ord($c{$a}) >= 240 && ord($c{$a}) <= 247) {
                $ud = (ord($c{$a}) - 240) * 262144 + (ord($c{$a + 1}) - 128) * 4096 + (ord($c{$a + 2}) - 128) * 64 + (ord($c{$a + 3}) - 128);
                $a += 4;
            } else if (ord($c{$a}) >= 248 && ord($c{$a}) <= 251) {
                $ud = (ord($c{$a}) - 248) * 16777216 + (ord($c{$a + 1}) - 128) * 262144 + (ord($c{$a + 2}) - 128) * 4096 + (ord($c{$a + 3}) - 128) * 64 + (ord($c{$a + 4}) - 128);
                $a += 5;
            } else if (ord($c{$a}) >= 252 && ord($c{$a}) <= 253) {
                $ud = (ord($c{$a}) - 252) * 1073741824 + (ord($c{$a + 1}) - 128) * 16777216 + (ord($c{$a + 2}) - 128) * 262144 + (ord($c{$a + 3}) - 128) * 4096 + (ord($c{$a + 4}) - 128) * 64 + (ord($c{$a + 5}) - 128);
                $a += 6;
            } else if (ord($c{$a}) >= 254 && ord($c{$a}) <= 255) { //error
                $ud = false;
            }
            $scill .= $prefix.$ud.";";
        }
        return $scill;
    }
}
/*
  PHP 转 ASCII

  require_once "ascii_class.php";
*/
$aa = new ascii;
echo "<xmp>";
echo $str = $aa->encode("PHP二次开发:www.111cn.net");
echo "</xmp>";
echo $aa->decode($str);
?>

矩阵不管在php或python中它只是一种算法了,我们要做的就是利用我们所学的程序来实现这种算法即可达到我们的需求了,下面来看它们的实现方法。
什么是螺旋矩阵?

螺旋矩阵是指一个呈螺旋状的矩阵,它的数字由第一行开始到右边不断变大,向下变大,向左变大,向上变大,如此循环。下图就是一个螺旋矩阵的示例:


郑晓在这里分别使用了Python和PHP来实现了数字的螺旋矩阵。其中的PHP版本写成了函数,更加灵活的对矩阵进行控制。写Python时由于是第一次写,有些生疏,分别用了两种方法来实现。。。下面上代码吧:

Python螺旋矩阵的第一版(比较难以理解?!):
#coding:gbk
L = 6 #矩阵大小
result = [[0]*L for n in range(L)]
row =0   #初始行   从左上角开始
col = 0  #初始列   从左上角开始
value = 1#初始值
direction = 'r' #初始方向 向右
circle = 1 #初始圈数 第一圈
while True:
        #向右走
        if direction == 'r':
                result[row][col] = value
                if col>=L-circle:
                        direction = 'd'
                        continue
                col += 1
        #向下走
        if direction =='d':
                result[row][col] = value
                if row >= L-circle:
                        direction = 'l'
                        continue
                row += 1
        #向左走
        if direction == 'l':
                result[row][col] = value
                if col <= circle -1:
                        direction = 'u'
                        continue
                col -= 1
        #向上走
        if direction == 'u':
                result[row][col] = value
                if row-1 <= circle:
                        direction = 'r'
                        circle += 1
                        #continue
                row -= 1
        value += 1
        if value > L * L :
                break
for R in result:
        for c in R:
                print "%3d" % (c) ,
        print
raw_input()


接下来是Python螺旋矩阵的第二版,其中使用了迭代器控制方向,代码量明显减少,而且更容易理解了。多次使用不同的起点生成的矩阵时,你会发现有个地方写的有点儿“问题”,找到问题了没有?

#coding:gbk
import itertools
#参数:矩阵宽(w)、高(h)、起始横坐标、起始纵坐标
def print_matrix(w, h, x = 0, y = 0):
    #方向移动时的操作
    op = [(1,0), (-1,0), (0,-1), (0,1)]
    #迭代器可无限迭代列表 每次要换方向时就next()
    direction = itertools.cycle(op)
    #根据行列生成所有坐标
    result = {(xx,yy):None for xx in range(w) for yy in range(h)}
    result[(x,y)] = 1
    _x, _y = direction.next()
    i = 1
    flag = 0 
    while True:
            new_x = x + _x
            new_y = y + _y
            if (new_x, new_y) in result and result[(new_x, new_y)] is None:
                i = i + 1
                result[(new_x, new_y)] = i
                x = new_x
                y = new_y
                flag = 0
            else:
                _x, _y = direction.next()
                flag = flag + 1
            if flag>4: break
    #打印结果
    for y in range(h):
        for x in range(w):
            print "%3d" % (result[(x,y)]),
        print
#调用示例
print_matrix(6,6,5,0)
raw_input()


下面是PHP版的螺旋矩阵,思路和上面的Python是一样的(其实我是照着写的…)。

/* *
 * @param $w : 宽
 * @param $h : 高
 * @param $s : 起始数字
 * @param $x, $y : 起始位置坐标 只能从四顶点开始
 * @param $r :方向 默认顺时间 false为逆时针
 * @author : 郑晓
 * php5.6.11
 * 这是一个螺旋矩阵的PHP版本,由于之前在python下写过,有了一些经验,所以在php中也使用了SPL的一个迭代器,用于换向。算法编写时是使用的过程式,后来又改为了函数,加入了一些自定义参数,方便调用(然并卵)。输出中使用的是制表和换行符,请在浏览器源代码中查看运行结果。
 */
function print_matrix($w, $h, $s=1, $l=1, $x=0, $y=0, $r=true) {
    $R = array(array(1,0), array(0,1), array(-1,0), array(0,-1));
    !$r && $R = array_reverse($R);
    $iterator = new InfiniteIterator(new ArrayIterator($R)); //创建一个无限迭代器
    $iterator->rewind(); //指针指向第一元素
    list($_x, $_y) = $iterator->current();
    $result = [];
    $result[$x][$y] = $s;
    for($i = $s+1; $i < $s+$w * $h; $i++) {
        $new_x = $x + $_x;
        $new_y = $y + $_y;
        
        if(0<= $new_x && 0<= $new_y && $new_x < $w && $new_y < $h && !isset($result[$new_x][$new_y])) {
            $result[$new_x][$new_y] = $i;
            $x = $new_x;
            $y = $new_y;
        } else {
            $iterator->next();
            list($_x, $_y) = $iterator->current();
            $i--;
        }
    }
    //以下是打印矩阵结构
    for($i=0; $i< $h; $i++) {
        for($j=0; $j< $w; $j++) {
            echo $result[$j][$i], "\t";
        }
        echo "\n";
    }
}
//调用示例测试
print_matrix(5, 5); echo "\n";
print_matrix(7, 4); echo "\n";
print_matrix(5, 5, 1, 4, 0); echo "\n";
print_matrix(5, 5, 10, 0, 4, false); echo "\n";


下面是依次的运行结果:

python螺旋矩阵

python螺旋矩阵

php螺旋矩阵

PHP生成唯一订单号其实是非常的简单了我们随便就可以整理多种生成方式了,这里小编整理了6种方式供各位参考。


做商城类项目经常需要生成唯一订单号,下面来个汇总!

方法一:

return date('Ymd') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT);

方法二: 正在使用。。。

/**

 *

 * uniqid - 官方是这样说的:

 * Gets a prefixed unique identifier based on the current time in microseconds.

 */

function build_order_no()

{

    return date('Ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);

}


用uniqid获取一个基于当前的微秒数生成的唯一不重复的字符串(但是他的前7位貌似很久才会发生变动,所以不用考虑可删除),取其第8到13位。但是这个字符串里面有英文字母,咋办?
用ord获取他的ASCII码,所以就有了下一步:用str_split把这个字符串分割为数组,用array_map去操作(速度快点)。
然后返回的还是一个数组,KO,在用implode弄成字符串,但是字符长度不定,取前固定的几位,然后前面加上当前的年份和日期,这个方法生成的订单号,全世界不会有多少重复的。
当然,除非你把服务器时间往前调,但是调也不用怕,哥不相信他会在同一微秒内下两次订单,网络数据传输也要点时间的,即便你是在本地。


方法三:以前使用。。。

public function make_order($user_id)

 {

 return mt_rand(10,99)

 . sprintf('%010d',time() - 946656000)

 . sprintf('%03d', (float) microtime() * 1000)

 . sprintf('%03d', (int) $user_id % 1000);

 }

方法四:

$yCode = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J');

$orderSn = $yCode[intval(date('Y')) - 2011] . strtoupper(dechex(date('m'))) . date('d') . substr(time(), -5) . substr(microtime(), 2, 5) . sprintf('%02d', rand(0, 99

));


方法五 生成24位唯一订单号码

//生成24位唯一订单号码,格式:YYYY-MMDD-HHII-SS-NNNN,NNNN-CC,其中:YYYY=年份,MM=月份,DD=日期,HH=24格式小时,II=分,SS=秒,NNNNNNNN=随机数,CC=检查码
  @date_default_timezone_set("PRC");
  while(true){
   //订购日期
   $order_date = date('Y-m-d');
   //订单号码主体(YYYYMMDDHHIISSNNNNNNNN)
   $order_id_main = date('YmdHis') . rand(10000000,99999999);
   //订单号码主体长度
   $order_id_len = strlen($order_id_main);
   $order_id_sum = 0;
   for($i=0; $i<$order_id_len; $i++){
    $order_id_sum += (int)(substr($order_id_main,$i,1));
   }
   //唯一订单号码(YYYYMMDDHHIISSNNNNNNNNCC)
   $order_id = $order_id_main . str_pad((100 - $order_id_sum % 100) % 100,2,'0',STR_PAD_LEFT);
  
   if($result = sqlite_query($db,"SELECT * FROM orders WHERE order_id='$order_id'")){
    if(sqlite_num_rows($result) == 0){
     break;
    }
   }

例子六

/** 

* 生成16位纯数字订单号 

* 最大支持时间到 2056-12-31 23:59:59 

* 

* @access public 

* @return string 

*/ 

public static function getOrderSN() { 

return (date('y') + date('m') + date('d')) . str_pad((time() - strtotime(date('Y-m-d'))), 5, 0, STR_PAD_LEFT) . substr(microtime(), 2, 6) . sprintf('%03d', rand(0, 999)); 

}

目前在用的,基本保证不重复了,能用到2056年,觉得应该够了,以后有需求再扩展

前面有介绍一个完整简单的PHP+AJAX实时检查帐号是否被注册,下文我们再整理一个更浅析简单的例子了,希望这个例子能够对各位有帮助。

带会员注册的网站都是需要会员在注册的时候检查数据库内是否已经存在这个会员了,并且提示给注册的用户,保持会员帐号的唯一性,否则就会乱套,这套代码收藏下来 比较适合大家用。

\

\
XML/HTML Code

<div class="both">  

        <h4> "John" , "eliane" </h4><br clear="all" /><br clear="all" />  

        <br clear="all" />  

        <div>  

            <label>User Name</label>  

            <input id="username" name="username" type="text" value="" onblur="return check_username();" />  

            <div id="Info"></div>  

            <span id="Loading"><img src="loader.gif" alt="" /></span>  

        </div>  

    </div>

JavaScript Code

<script type="text/javascript">  

  

$(document).ready(function() {  

    $('#Loading').hide();      

});  

  

function check_username(){  

  

    var username = $("#username").val();  

    if(username.length > 2){  

        $('#Loading').show();  

        $.post("check_username_availablity.php", {  

            username: $('#username').val(),  

        }, function(response){  

            $('#Info').fadeOut();  

             $('#Loading').hide();  

            setTimeout("finishAjax('Info', '"+escape(response)+"')", 450);  

        });  

        return false;  

    }  

}  

  

function finishAjax(id, response){  

   

  $('#'+id).html(unescape(response));  

  $('#'+id).fadeIn(1000);  

}   

  

</script>

 check_username_availablity.php
 
PHP Code
 

<?php  

include('../../conn.php');  

if($_REQUEST)  

{  

    $username   = $_REQUEST['username'];  

    $query = "select * from username_list where username = '".strtolower($username)."'";  

    $results = mysql_query( $query) or die('ok');  

      

    if(mysql_num_rows(@$results) > 0) // not available  

    {  

        echo '<div id="Error">Already Taken</div>';  

    }  

    else  

    {  

        echo '<div id="Success">Available</div>';  

    }  

      

}?>

 

[!--infotagslink--]

相关文章

  • python opencv 画外接矩形框的完整代码

    这篇文章主要介绍了python-opencv-画外接矩形框的实例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-04
  • C#连接SQL数据库和查询数据功能的操作技巧

    本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
  • Python astype(np.float)函数使用方法解析

    这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08
  • 最炫Python烟花代码全解析

    2022虎年新年即将来临,小编为大家带来了一个利用Python编写的虎年烟花特效,堪称全网最绚烂,文中的示例代码简洁易懂,感兴趣的同学可以动手试一试...2022-02-14
  • python中numpy.empty()函数实例讲解

    在本篇文章里小编给大家分享的是一篇关于python中numpy.empty()函数实例讲解内容,对此有兴趣的朋友们可以学习下。...2021-02-06
  • php简单数据操作的实例

    最基础的对数据的增加删除修改操作实例,菜鸟们收了吧...2013-09-26
  • python-for x in range的用法(注意要点、细节)

    这篇文章主要介绍了python-for x in range的用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-10
  • Python 图片转数组,二进制互转操作

    这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
  • Python中的imread()函数用法说明

    这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
  • 解决Mybatis 大数据量的批量insert问题

    这篇文章主要介绍了解决Mybatis 大数据量的批量insert问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-09
  • python实现b站直播自动发送弹幕功能

    这篇文章主要介绍了python如何实现b站直播自动发送弹幕,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下...2021-02-20
  • Antd-vue Table组件添加Click事件,实现点击某行数据教程

    这篇文章主要介绍了Antd-vue Table组件添加Click事件,实现点击某行数据教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-17
  • 详解如何清理redis集群的所有数据

    这篇文章主要介绍了详解如何清理redis集群的所有数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-18
  • 不打开网页直接查看网站的源代码

      有一种方法,可以不打开网站而直接查看到这个网站的源代码..   这样可以有效地防止误入恶意网站...   在浏览器地址栏输入:   view-source:http://...2016-09-20
  • php 调用goolge地图代码

    <?php require('path.inc.php'); header('content-Type: text/html; charset=utf-8'); $borough_id = intval($_GET['id']); if(!$borough_id){ echo ' ...2016-11-25
  • python Matplotlib基础--如何添加文本和标注

    这篇文章主要介绍了python Matplotlib基础--如何添加文本和标注,帮助大家更好的利用Matplotlib绘制图表,感兴趣的朋友可以了解下...2021-01-26
  • vue 获取到数据但却渲染不到页面上的解决方法

    这篇文章主要介绍了vue 获取到数据但却渲染不到页面上的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-19
  • 解决python 使用openpyxl读写大文件的坑

    这篇文章主要介绍了解决python 使用openpyxl读写大文件的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-13
  • JS基于Mootools实现的个性菜单效果代码

    本文实例讲述了JS基于Mootools实现的个性菜单效果代码。分享给大家供大家参考,具体如下:这里演示基于Mootools做的带动画的垂直型菜单,是一个初学者写的,用来学习Mootools的使用有帮助,下载时请注意要将外部引用的mootools...2015-10-23
  • python 计算方位角实例(根据两点的坐标计算)

    今天小编就为大家分享一篇python 计算方位角实例(根据两点的坐标计算),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-27