爬虫学习第一部分

第一部分主要学习内容html等有关知识,api使用,request-get使用 拔高部分:js

之前做过一些简单爬虫,对request-get的使用比较熟悉。以下代码是之前爬取链家二手房数据,较为简单,以武汉市为例,结果保存在txt中。

import requests  
from bs4 import BeautifulSoup  

def getHTMLText(url):  
    try:  
        r = requests.get(url,timeout=30)  
        r.raise_for_status()  
        r.encoding = r.apparent_encoding  
        return r.text  
    except:  
        return '产生异常'  


url0="https://wh.lianjia.com/ershoufang/"
url_="https://wh.lianjia.com/"
res0=getHTMLText(url0)
soup0= BeautifulSoup(res0,'html.parser')
infos0= soup0.find('div',{'data-role':'ershoufang'}).find_all('a')
#print (infos0[0]['href'])

for url1 in infos0:
    strurl=url_+url1['href']
    res=getHTMLText(strurl)
    soup = BeautifulSoup(res,'html.parser')
    district=url1.get_text()
    print(district)
    #获取到区域地址
    infosr = soup.find('div',{'data-role':'ershoufang'}).find_all('div')
    infosr1=infosr[1].find_all('a')
    fw = open("./whfangjiaershoufang20200421.txt","a+")

    for urlq in infosr1:
        #区域地址内获取房价
        strurl=url_+urlq['href']
        print(urlq['href'])
        resq=getHTMLText(strurl)
        soupq= BeautifulSoup(resq,'html.parser')
        infosq = soupq.find('div',{'data-role':'ershoufang'}).find_all('div')
        districtq=infosq[0].find('a',{'class':'selected'}).get_text()
        if districtq==district:
            #获取页数
            infos= soupq.find('div',{'class':'page-box house-lst-page-box'})
            pageinfo=infos['page-data']
            str0=pageinfo.split(',')[0].split(':')[1]  #获取页数
            num=int(str0)
            index = [i+1 for i in range(num)]
            print("begin")
            for pa in index:  
                try:
                    if pa==1:
                        url = strurl
                    else:
                        url = strurl+"pg%d/"%(pa)
                    #print(url)

                    respage=getHTMLText(url)
                    souppage = BeautifulSoup(respage,'html.parser')
                    infos = souppage.find('ul',{'class':'sellListContent'}).find_all('li')  
                    #print("OK")

                    for i in range(len(infos)):
                       name = infos[i].find('div',{'class':'title'}).find('a').get_text()  
                       price =infos[i].find('div',{'class':'priceInfo'}).find('div',{'class','totalPrice'}).find('span').get_text()
                       unitprice =infos[i].find('div',{'class':'priceInfo'}).find('div',{'class','unitPrice'}).find('span').get_text() 
                       address=infos[i].find('div',{'class':'address'}).find('div',{'class','houseInfo'}).find('a').get_text()
                       position=infos[i].find('div',{'class':'flood'}).find('div',{'class','positionInfo'}).find('a').get_text()
                       city="武汉"
                       formatStr = "%s,%s,%s,%s,%s,%s,%s\n"%(city,district,position,name,address,price,unitprice)
                       print(formatStr)
                       fw.write(formatStr)
                except:
                    pass
          
        else:
            continue
    fw.close()

本次学习重点为api的使用,正好举例是使用百度地图,算是本行。

以下部分摘自https://github.com/datawhalechina/team-learning/blob/master/Python%E7%88%AC%E8%99%AB%E7%BC%96%E7%A8%8B%E5%AE%9E%E8%B7%B5/task1/task1.ipynb  。

使用api

所谓的采集网络数据,并不一定必须从网页中抓取数据,而api(Application Programming Iterface)的用处就在这里:API为开发者提供了方便友好的接口,不同的开发者用不同的语言都能获取相同的数据。目前API一般会以XML(Extensible Markup Language,可拓展标记语言)或者JSON(JavaScript Object Notation)格式来返回服务器响应,其中JSON数据格式越来越受到人们的欢迎,我们后面的课程也会详细介绍JSON格式。

API使用示例

下面以百度地图提供的API为例,首先我们打开链接:http://lbsyun.baidu.com/apiconsole/key 填写自己的信息 ,获取AK

<!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" />
	<style type="text/css">
		body,
		html,
		#allmap {
			width: 100%;
			height: 100%;
			overflow: hidden;
			margin: 0;
			font-family: "微软雅黑";
		}
	</style>
	<script type="text/javascript" src="http://api.map.baidu.com/api?v=3.0&ak="></script>//填写ak后面的值
	<title>地图展示</title>
</head>

<body>
	<div id="allmap"></div>
</body>

</html>
<script type="text/javascript">
	// 百度地图API功能
	var map = new BMap.Map("allmap"); // 创建Map实例
	map.centerAndZoom(new BMap.Point(116.404, 39.915), 11); // 初始化地图,设置中心点坐标和地图级别
	//添加地图类型控件
	map.addControl(new BMap.MapTypeControl({
		mapTypes: [
			BMAP_NORMAL_MAP,
			BMAP_HYBRID_MAP
		]
	}));
	map.setCurrentCity("北京"); // 设置地图显示的城市 此项是必须设置的
	map.enableScrollWheelZoom(true); //开启鼠标滚轮缩放
</script>

上述代码是调用api的简单例子,可以在浏览器上显示以北京为中心的百度地图

百度地图api还有很多作用,关于百度地图API的其他使用,其官方文档说的非常详细和清楚 http://lbsyun.baidu.com/index.php?title=jspopular3.0 ,大概浏览了下,里面有很多功能,基本涵盖电子地图的开发功能,还有比较炫酷的可视化渲染效果,有时间可以研究下,但是调用需要有一定的网页基础,这点要加强。

如何实现地理编码功能

import requests

def getUrl(*address):
    ak = ''  ## 填入你的api key
    if len(address) < 1:
        return None
    else:
        for add in address:
            url = 'http://api.map.baidu.com/geocoding/v3/?address={0}&output=json&ak={1}'.format(add, ak)
            yield url

def getPosition(url):
    '''返回经纬度信息'''
    res = requests.get(url)
    # print(res.text)
    json_data = eval(res.text)

    if json_data['status'] == 0:
        lat = json_data['result']['location']['lat']  # 纬度
        lng = json_data['result']['location']['lng']  # 经度
    else:
        print("Error output!")
        return json_data['status']
    return lat, lng


if __name__ == "__main__":
    address = ['北京市清华大学', '北京市北京大学', '保定市华北电力大学', '上海市复旦大学', '武汉市武汉大学']
    for add in address:
        add_url = list(getUrl(add))[0]
        print('url:', add_url)
        try:
            lat, lng = getPosition(add_url)
            print("{0}|经度:{1}|纬度:{2}.".format(add, lng, lat))
        except Exception  as e:
            print(e)

url: http://api.map.baidu.com/geocoding/v3/?address=北京市清华大学&output=json&ak=1fb3ef2c6f7a9a41bba53f38144b8eff
北京市清华大学|经度:116.33337396094367|纬度:40.009645090734296.
url: http://api.map.baidu.com/geocoding/v3/?address=北京市北京大学&output=json&ak=1fb3ef2c6f7a9a41bba53f38144b8eff
北京市北京大学|经度:116.31683256328296|纬度:39.99887680537622.
url: http://api.map.baidu.com/geocoding/v3/?address=保定市华北电力大学&output=json&ak=1fb3ef2c6f7a9a41bba53f38144b8eff
保定市华北电力大学|经度:115.52130317483764|纬度:38.89477430426888.
url: http://api.map.baidu.com/geocoding/v3/?address=上海市复旦大学&output=json&ak=1fb3ef2c6f7a9a41bba53f38144b8eff
上海市复旦大学|经度:121.74295536914276|纬度:31.06665792321301.
url: http://api.map.baidu.com/geocoding/v3/?address=武汉市武汉大学&output=json&ak=1fb3ef2c6f7a9a41bba53f38144b8eff
武汉市武汉大学|经度:114.37292090919235|纬度:30.543803317143624.

更多参数可以查看官方文档: http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值