用python采集数据_记录使用jQuery和Python抓取采集数据的一个实例

从现成的网站上抓取汽车品牌,型号,车系的数据库记录。

先看成果,大概4w条车款记录

336056-20160516154102919-1133509286.png

336056-20160516154229357-1566474609.png

一共建了四张表,分别存储品牌,车系,车型和车款

大概过程:

使用jQuery获取页面中呈现的大批内容

能通过页面一次性获得所需大量数据的,通过jQuery获取原数据,并一条条显示在console面板中。每条我是直接拼接成sql显示。

打开chrome,进到地址http://www.autozi.com/carBrandLetter/.html。按F12点console面板。粘贴下面的内容

$("tr.event_scroll").each(function(i){var _this = $(this);//奥迪,宝马各个主品牌

var mainBrandName = _this.find('th>h4').text();var seriesList = $(this).find('.car-series-list li');

$.each(seriesList,function(i, el){//各品牌下的子品牌,如奥迪下有进口奥迪和一汽奥迪

var subBrandName = $(el).find('h4').text();//各个车系,如奥迪A6,A4

var models = $(el).find('a.carModel')

$.each(models,function(j, element){var model =$(element).text();var carSeriesId = getCarSeriesId($(element).attr('s_href'));//拼接成sql语句,插入数据库用

getSql(subBrandName,model,carSeriesId);

})

});

});//根据地址获取参数id//如http://www.autozi.com:80/carmodels.do?carSeriesId=1306030951244661 得到1306030951244661

functiongetCarSeriesId(str) {return str.slice(str.indexOf('=')+1);

}//拼接成sql语句,插入数据库用//insert into tableName(brandName, name, carSeriesId) values ("一汽奥迪", "A6", "425");

functiongetSql(subBrandName,model,carSeriesId) {var str = 'insert into tableName(brandName, name, carSeriesId) values ("'+subBrandName+'", "'+model+'", "'+carSeriesId+'");';

console.log(str);

}

回车,显示如下。

这样我就拿到了所有的汽车品牌,子品牌和车系。

336056-20160504120818185-67267100.png

但是具体的包含年份和排量的车型还没有办法拿到。比如奥迪A6L。有2011年款2.0L的,有2005年4.2L的。

网站做成了在弹窗中显示。

336056-20160504121544185-1800289483.png

比如点击A6L。发送一个ajax请求,请求地址是:http://www.autozi.com/carmodels.do?carSeriesId=425&_=1462335011762

当点击第二页,又发起了一个新的ajax请求,请求地址是:http://www.autozi.com/carmodelsAjax.do?currentPageNo=2&carSeriesId=425&_=1462335011762

奥迪A6L一共有四页carSeriesId=425刚才已经拿到了。要获得所有年份和排量的A6L。就要发起四个请求,地址是:

http://www.autozi.com/carmodelsAjax.do?currentPageNo=[#page]&carSeriesId=425

[#page]即为1-4。每次改变下分页参数数值即可。当请求不存在的http://www.autozi.com/carmodelsAjax.do?currentPageNo=5&carSeriesId=425。会返回空页面。

使用Python获取页面中的内容

getSoup是打开页面并返回html,请求页面地址中初始pageNo参数是1。判断返回的html是否为空。如果有内内容则pageNo+1。继续请求这个地址。

如果没有则请求下一个车系的地址。

每两个车系之间暂停10秒。因为我发现如果操作过于频繁服务端会返回空。

from urllib.request importurlopenfrom bs4 importBeautifulSoupfrom time importsleep#carList

defgetList(carList):

fo= open("cars.txt", "a+")for link in soup.find_all("a", class_="link"):#print(link.get('title'))

fo.write(link.get('title')+'\n')

fo.close()defgetSoup(modelId, pageNumber):

tpl_url= "http://www.autozi.com/carmodelsAjax.do?carSeriesId=[#id]&currentPageNo=[#page]"real_url= tpl_url.replace('[#id]', str(modelId))

real_url= real_url.replace('[#page]', str(pageNumber))

from_url= urlopen(real_url).read().decode('utf-8')

soup= BeautifulSoup(from_url, "html5lib")returnsoup

modelIds= [741,1121,357,1055]for modelId inmodelIds:

flag=True

i= 1

whileflag:

soup=getSoup(modelId, i)

carList= soup.find_all('li', limit=1)iflen(carList):

getList(carList)

i=i+1

else:

flag=False

sleep(10)

因为这个脚本的执行时间会很长,我是放到自己的vps上,将该脚本另存为car.py

然后在linux命令行里执行 nohup ./car.py &

这样保证防止断网退出执行,同时将该任务放到后台。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值