python爬虫程序代码火车票(python爬取火车票信息)
python爬虫能干什么
python爬虫就是模拟浏览器打开网页,获取网页中想要的那部分数据。利用爬虫我们可以抓取商品信息、评论及销量数据;可以抓取房产买卖及租售信息;可以抓取各类职位信息等。
爬虫:
网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
(推荐教程:Python入门教程)
通俗的讲就是通过程序去获取web页面上自己想要的数据,也就是自动抓取数据。
python爬虫能做什么?
从技术层面来说就是通过程序模拟浏览器请求站点的行为,把站点返回的HTML代码/JSON数据/二进制数据(图片、视频) 爬到本地,进而提取自己需要的数据存放起来使用。
利用爬虫我们可以获取大量的价值数据,从而获得感性认识中不能得到的信息,比如:
爬取知乎优质答案,为你筛选出各话题下最优质的内容。
抓取淘宝、京东商品、评论及销量数据,对各种商品及用户的消费场景进行分析。
抓取房产买卖及租售信息,分析房价变化趋势、做不同区域的房价分析。
爬取各类职位信息,分析各行业人才需求情况及薪资水平。
爬虫的本质:
爬虫的本质就是模拟浏览器打开网页,获取网页中我们想要的那部分数据。
python爬虫12306获取是否有车票
看看这个可以吗
功能:
1:全自动爬所有车站列表
2:爬所有车站之间的所有车次,过滤重复,保存文件
爬过程中保存文件
遇到http异常,停止继续
脚本代码
[python] view plaincopy
#coding:utf-8
__author__ = 'watsy'
from sgmllib import SGMLParser
import urllib
import urllib2
import datetime
import json
import os
from time import sleep
# 城市对象
class cityObject(object):
def __init__(self, abbr_pinyin="", full_pinyin="",chinaname="",shortCode=""):
self.abbr_pinyin = abbr_pinyin
self.full_piyin = full_pinyin
self.chinaname = chinaname
self.shortCode = shortCode
# 火车
class trainObject(object):
def __init__(self, tid="", code="", start_city="", start_time="", end_city="", end_time="", full_time=""):
self.tid = tid
self.code = code
self.start_city = start_city
self.start_time = start_time
self.end_city = end_city
self.end_time = end_time
self.full_time = full_time
def get_writestr(self):
# return ("%s,%s,%s,%s,%s,%s,%s") % (self.tid, self.code, self.start_city.encode('utf-8'), self.start_time, self.end_city.encode('utf-8'), self.end_time, self.full_time)
str_return = self.tid + ",";
str_return += self.code + ",";
str_return += self.start_city + ",";
str_return += self.start_time + ",";
str_return += self.end_city + ",";
str_return += self.end_time + ",";
str_return += self.full_time;
return str_return
# 火车列表
class trainModel(list):
def isExist(self, train):
for sub_train in self:
if sub_train.code == train.code:
return True
return False
def save(self):
train = self[-1]
with open(("%s.txt") % (train.code), "w") as wf:
print train.get_writestr()
wf.write(train.get_writestr().encode('utf-8'))
# 解析城市
def parserCitys(data):
parser_citys = []
for original_city in data:
if original_city and len(original_city) 1:
split_city = original_city.split('|')
parser_city = cityObject(split_city[0], split_city[3], split_city[1], split_city[2])
parser_citys.append(parser_city)
print len(parser_citys)
return parser_citys
# 生成url地址
def getBookingTrainListUrl(start_code, end_code, day):
strUrl = (";")
strUrl += ("orderRequest.train_date=%s") % (day)
strUrl += ("orderRequest.from_station_telecode=%s") % (start_code)
strUrl += ("orderRequest.to_station_telecode=%s") % (end_code)
strUrl += ("orderRequest.train_no=trainPassType=QBtrainClass=QB%23D%23Z%23T%23K%23QT%23includeStudent=00seatTypeAndNum=orderRequest.start_time_str=00%3A00--24%3A00")
return strUrl
trains = trainModel()
# 解析 预定车次列表
def parser_booking_str(str_booking):
json_book = json.loads(str_booking)
datas = json_book['datas']
if datas and len(datas) 1:
# print datas.replace(" ","")
trainlist = datas.replace(" ","").split("\\n")
for train_str in trainlist:
train_str_list = train_str.split(',')
if len(train_str_list) == 17:
str_id_and_code = train_str_list[1]
str_start_city_and_time = train_str_list[2]
str_end_city_and_time = train_str_list[3]
str_full_time = train_str_list[4]
# print str_id_and_code
str_id = str_id_and_code[13:25]
str_code = str_id_and_code[131:-7]
# print str_start_city_and_time
if len(str_start_city_and_time) 50:
str_start_city = str_start_city_and_time[43:-9]
else :
str_start_city = str_start_city_and_time[0:-9]
str_start_time = str_start_city_and_time[-5:]
# print str_end_city_and_time
if len(str_end_city_and_time) 50:
str_end_city = str_end_city_and_time[42:-9]
else:
str_end_city = str_end_city_and_time[0:-9]
str_end_time = str_end_city_and_time[-5:]
tobj = trainObject(str_id, str_code, str_start_city, str_start_time, str_end_city, str_end_time, str_full_time)
if trains.isExist(tobj) == False:
trains.append(tobj)
trains.save()
#打开城市列表页面
u = urllib2.urlopen("")
buffer = u .read()
u.close()
#获取列表
buffer = buffer[20:-3]
unformatter_citys = buffer.split('@')
#得到城市
parser_citys = parserCitys(unformatter_citys)
city_length = len(parser_citys)
today = datetime.date.today()
torrow = datetime.timedelta(days=1)
today = today + torrow
day_str = ("%s-%02d-%02d") % (today.year, int(today.month), int(today.day))
print (day_str)
strPath = os.getcwd()
os.chdir("%s/train/" % strPath)
for i in range(1, city_length):
for j in range(0 , len(parser_citys) - i):
try:
print ("[%d %d]" % (i , j))
sleep(0.09)
strurl = getBookingTrainListUrl(parser_citys[i].shortCode, parser_citys[j].shortCode, day_str)
url_add_header = urllib2.Request(strurl)
url_add_header.add_header('X-Requested-With', "XMLHttpRequest")
url_add_header.add_header('Referer', "")
url_add_header.add_header('Content-Type', 'application/x-www-form-urlencoded')
url_add_header.add_header('Connection', 'keep-alive')
resp = urllib2.urlopen(url_add_header)
urlread = resp.read()
resp.close()
parser_booking_str(urlread)
except urllib2.HTTPError as err:
print ("error : [%s] url=[%s]") % (err, strurl)
exit(1)
os.chdir(strPath)
print len(trains)
Python:基于Python爬虫技术的抢票程序及其实现
临近放假,相信我们每天都在群聊里或者朋友圈看到一些帮忙抢火车票的信息。看到朋友们抢回家的车票这么辛( bei )苦( can ),结合圈里一些前辈的指点,抱着学习的心态用 Python 做了一个简单的自动化抢票程序,抢到票之后通过绑定的邮箱(比如 QQ )发通知。下面分享主要内容:
然后,开始使劲地码:
1. 定义自动购票的类(初始化属性)
2. 实现登录功能
3. 实现购票功能
4. 邮箱通知付款
还有,网络不好或者 12306 的服务器不稳定的时候,就会卡住,针对这种情况,系统会重复查询:
最后,祝大家都能顺利抢到票.
本文以转载于博客园小帝君的博客
15《Python 原生爬虫教程》爬虫和反爬虫
有的时候,当我们的爬虫程序完成了,并且在本地测试也没有问题,爬取了一段时间之后突然就发现报错无法抓取页面内容了。这个时候,我们很有可能是遇到了网站的反爬虫拦截。
我们知道,网站一方面想要爬虫爬取网站,比如让搜索引擎爬虫去爬取网站的内容,来增加网站的搜索排名。另一方面,由于网站的服务器资源有限,过多的非真实的用户对网站的大量访问,会增加运营成本和服务器负担。
这是一种最基本的反爬虫方式,网站运营者通过验证爬虫的请求头的 User-agent,accep-enconding 等信息来验证请求的发出宿主是不是真实的用户常用浏览器或者一些特定的请求头信息。
通过 Ajax,或 者javascript 来动态获取和加载数据,加大爬虫直接获取数据的难度。
这个相信大多数读者非常熟悉了吧,当我们输错多次密码的时候,很多平台都会弹出各种二维码让我们识别,或者抢火车票的时候,会出现各种复杂的验证码,验证码是反爬虫措施中,运用最广,同时也是最有效直接的方式来阻止爬虫的措施之一。
在识别到某些异常的访问的时候,网站运营者会设置一个黑名单,把一些判定为爬虫的IP进行限制或者封杀。
有些网站,没有游客模式,只有通过注册后才可以登录看到内容,这个就是典型的使用账号限制网站,一般可以用在网站用户量不多,数据安全要求严格的网站中。
我们可以在请求头中替换我们的请求媒介,让网站误认为是我们是通过移动端的访问,运行下面的代码后,当我们打开 hupu.html,我们会发现返回的是移动端的虎扑的页面而不是网页端的。
比如,我们可以设置一个随机的间隔时间,来模拟用户的行为,减少访问的次数和频率。 我们可以在我们爬虫的程序中,加入如下的代码,让爬虫休息3秒左右,再进行爬取,可以有效地避开网站的对爬虫的检测和识别。
代理就是通过访问第三方的机器,然后通过第三方机器的 IP 进行访问,来隐藏自己的真实IP地址。
由于第三方代理良莠不齐,而且不稳定,经常出现断线的情况,爬取速度也会慢许多,如果对爬虫质量有严格要求的话,不建议使用此种方法进行爬取。
可以通过动态的 IP 拨号服务器来变换 IP,也可以通过 Tor 代理服务器来变换 IP。
反反爬虫的策略,一直是在变换的,我们应该具体问题具体分析,通过不断的试错来完善我们的爬虫爬取,千万不要以为,爬虫程序在本机调试之后,没有问题,就可以高枕无忧了。线上的问题,总是千变万化,我们需要根据我们的具体反爬措施,来针对的写一些反反爬虫的代码,这样才能保证线上环境的万无一失。