首先交代背景,逗逼女朋友每个月要花费半天多的时间去汽车网上找三十多个城市、十多款车型的报价数据,而且他们部门其它人也要做这种繁琐的工作。我在网络卡屎的情况下帮她做了一回,我就打死都想写个程序把这种stupid的工作自动搞定。
上论坛一问,了解到原来这个叫爬虫,用python写比较简单。
那就开始学python,学爬虫。
其实没具体学python,或者对于爬虫的基本了解,直接看的这位博主的文章[Python]网络爬虫(六):一个简单的百度贴吧的小爬虫,这是一个系列,花了点时间全看下来大概python照着模式写就够用了。
爬虫(Spider)的英文名其实很形象,整个互联网就是一张大网,而爬虫就像一种蜘蛛能够在这个网上爬来爬去,从一个网址跳转到另一个网站,抓取有价值的东西。
本程序所用python为3.4.2,系统为win7-64位,所有用到的插件请下载对应的版本
然后是网页的url分析,就是去多看多找,查看网页源码看是否能看到直接要的数据,如果找得到,可以直接使用正则表达正拿到数据,如果找不到,是js动态生成的,就去看源码里的js代码,搜索关键字url去找js拿去request的url,分析它的情况。
在本例中,汽车之家的数据是分析js代码所得url,通过url可直接请求得到城市与低价信息,用正则表达式获取
易车网数据可通过网页源码获取,所以其url就是浏览器地址上的url,通过url可请求到整个网页,再用正则表达式获取城市与价格信息
所有数据获取之后通过xlwr3和xlrd、xlutils保存到EXCEL中
源码
# -*- coding: utf-8 -*-
#---------------------------------------
# 程序:汽车之家&易车网最低价格抓取爬虫
# 版本:0.1
# 作者:top_along
# 日期:2015-01-24
# 语言:Python 3.4.2
# 操作:直接打开
# 功能:抓取汽车之家上所有城市所需车型最低报价。
#---------------------------------------
import string, urllib.request
import re
import os
import xlwt3 as xlwt
import xlrd
from xlutils.copy import copy
import time
#from citys import citys
#汽车之家抓取函数
def qichezhijia(filename, cityId, specId):
url = 'http://www.autohome.com.cn/ashx/AjaxDealerPrice.ashx?cityid=' \
+ str(cityId) + '00&specId=' + str(specId)
m = urllib.request.urlopen(url).read()
unicodePage = m.decode('gbk')
reg = '([0-9\\.]+).*cityNameDefault=\'(.+)\';'
items = re.search(reg, unicodePage, re.S)
if items == None:
return
city = str(items.group(2))
price = str(items.group(1))
if city == "全国":
return
output = '[汽车之家]: ' + city + ' 数据正在写入...'
print(output)
saveToExcel(filename, cityId, specId, price, 0)
return
#易车网抓取函数
def yichewang(filename, cityId, specId):
url = 'http://car.bitauto.com/' + str(specId) \
+ '/baojia/c' + str(cityId) + '/'
m = urllib.request.urlopen(url).read()
unicodePage = m.decode('utf-8')
regCity = '- (.+):
- '
items = re.search(regCity, unicodePage, re.S)
if items == None:
return
city = str(items.group(1))
regPrice = '裸车售价:([0-9\\.]+)万元
http://keliang.blog.51cto.com/3359430/661884
打包后闪退的情况是缺少部分插件,参见
http://blog.csdn.net/u014000832/article/details/39527981