1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 小白入门爬虫~爬取12306车次信息(静态网站和动态网站的区分)(get动态网页的爬取)

小白入门爬虫~爬取12306车次信息(静态网站和动态网站的区分)(get动态网页的爬取)

时间:2022-11-23 20:09:54

相关推荐

小白入门爬虫~爬取12306车次信息(静态网站和动态网站的区分)(get动态网页的爬取)

elements,console,source,network

elements分析网络结构,获取想要的数据

console打印一些网站的数据,做网站的时候有时候可能会在控制台上打印一些数据

source源文件,相等于一个文件夹,不仅包含网络的元素,还包含一些其他的内容,

如果是静态数据,在elements当中就可以查看到,如果是动态数据在elements之中无法查看

比如说我们在百度之中搜索美女,会出现各种美女图片,此时随着我们下拉的过程,滚动条会越变越小,然后我们搜索网页源代码之中的关键信息

点击source标签,按ctrl+f7输入关键信息,将俏皮美女奚梦瑶的信息输入进去,发现无法找到相应的内容

(也可以右击上面的page按钮,然后点击search in all files的对应属性)

说明网页中呈现的为动态信息,是后来嵌入到页面之中的,为模板+ajax渲染的动态数据,爬虫一定要关注请求与响应。

浏览器:发送请求(请求的url,请求的方式get/pos,请求数据)

服务器:作出响应(响应的状态码,响应数据[二进制数据?文本数据?JSON数据?])

响应返回的数据不同,解析的过程也不同。

418:发现被爬虫了。

爬虫:模拟浏览器想服务器发送请求并处理响应结果

Element(元素html,css,js)

Console

Source(相等于文件夹,Elements,html,css,js)

Network(所有发送的请求都会在这)

查询北京到天津的车次,查询结果如下图

找到请求对应的url

打开网页之后的地址栏保存的为页面的结构,这里面打开的内容才为数据的请求

原先地址栏中的内容:

/otn/leftTicket/init?linktypeid=dc&fs=%E5%8C%97%E4%BA%AC,BJP&ts=%E5%A4%A9%E6%B4%A5,TJP&date=-07-22&flag=N,N,Y

请求参数为中文并且为get请求的时候,如果想要放到地址栏上,就需要进行编码

通过编码并且解码之后得到的就是地址栏中对应的相应的结果

import urllib.parsekw = {'city':'北京'}#编码result = urllib.parse.urlencode(kw)print(result)#解码res = urllib.parse.unquote(result)print(res)

想要数据必须解析相应的格式

在elements栏目中找到对应的编码方式

#编写python代码,模拟浏览器向服务器发送请求,安装一个第三方模块requestsimport requests#请求:url,方式,由于该url请求方式为get,所以使用requests中的get方法url = '/otn/leftTicket/query?leftTicketDTO.train_date=-07-22&leftTicketDTO.from_station=BJP&leftTicketDTO.to_station=TJP&purpose_codes=ADULT'resp = requests.get(url) #请求的结果为响应#设置响应的编码格式,不然会发生乱码resp.encoding = 'utf-8'print(resp.text)

此时会发现爬取到的数据与浏览器中的数据不一样--------数据爬丢了,因为使用python发请求被服务器发现了,所以响应回来的数据不是想要的数据,必须加上header

#编写python代码,模拟浏览器向服务器发送请求,安装一个第三方模块requestsimport requests#请求:url,方式,由于该url请求方式为get,所以使用requests中的get方法url = '/otn/leftTicket/query?leftTicketDTO.train_date=-07-22&leftTicketDTO.from_station=BJP&leftTicketDTO.to_station=TJP&purpose_codes=ADULT'headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36'}resp = requests.get(url,headers=headers) #请求的结果为响应#设置响应的编码格式,不然会发生乱码resp.encoding = 'utf-8'print(resp.text)

此时仍然失败,还需要加上一个cookie内容,

继续加到请求头当中(如果不行还需要继续添加请求头)

#编写python代码,模拟浏览器向服务器发送请求,安装一个第三方模块requestsimport requests#请求:url,方式,由于该url请求方式为get,所以使用requests中的get方法url = '/otn/leftTicket/query?leftTicketDTO.train_date=-07-22&leftTicketDTO.from_station=BJP&leftTicketDTO.to_station=TJP&purpose_codes=ADULT'headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36','Cookie': '_uab_collina=159538369140806450712937; JSESSIONID=FA4A5E1D961C469DDD0AA8F8B557BA03; BIGipServerotn=49283594.50210.0000; RAIL_EXPIRATION=1595693855055; RAIL_DEVICEID=lrRDw-T9TpJ4Bq7322B2k-yVhvP9ss_szNaNB9KMlQFe86NDdNqZprmY1YbIisXUs8TbVKvi37n7QJj08Uip6Uf7weeFkz_zF_6OYbK4OfL-XsXkQrGNcaddC5KsIU0ffZYkTmiusPnehxeEX1O5ya3R7mGGr0Q7; BIGipServerpool_passport=200081930.50215.0000; route=495c805987d0f5c8c84b14f60212447d; _jc_save_fromStation=%u5317%u4EAC%2CBJP; _jc_save_toStation=%u5929%u6D25%2CTJP; _jc_save_fromDate=-07-22; _jc_save_toDate=-07-22; _jc_save_wfdc_flag=dc'}resp = requests.get(url,headers=headers) #请求的结果为响应#设置响应的编码格式,不然会发生乱码resp.encoding = 'utf-8'print(resp.text)

此时成功骗过了服务器,得到相应的数据。

模拟多个浏览器可以采用分布式的爬虫方法。

提取出来数据之后,对已经提取出的数据进行json的格式解析

接下来需要解析数据

{}为字典 可以根据key获取值 在本项目中键为data,获取到的value依然是一个字典,该字典中有key为result的值是一个车次的列表,首先尝试着用’|'对返回的字符串进行分割,代码如下:

#编写python代码,模拟浏览器向服务器发送请求,安装一个第三方模块requestsimport requestsdef send_request():#请求:url,方式,由于该url请求方式为get,所以使用requests中的get方法url = '/otn/leftTicket/query?leftTicketDTO.train_date=-07-22&leftTicketDTO.from_station=BJP&leftTicketDTO.to_station=TJP&purpose_codes=ADULT'headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36','Cookie': '_uab_collina=159538369140806450712937; JSESSIONID=FA4A5E1D961C469DDD0AA8F8B557BA03; BIGipServerotn=49283594.50210.0000; RAIL_EXPIRATION=1595693855055; RAIL_DEVICEID=lrRDw-T9TpJ4Bq7322B2k-yVhvP9ss_szNaNB9KMlQFe86NDdNqZprmY1YbIisXUs8TbVKvi37n7QJj08Uip6Uf7weeFkz_zF_6OYbK4OfL-XsXkQrGNcaddC5KsIU0ffZYkTmiusPnehxeEX1O5ya3R7mGGr0Q7; BIGipServerpool_passport=200081930.50215.0000; route=495c805987d0f5c8c84b14f60212447d; _jc_save_fromStation=%u5317%u4EAC%2CBJP; _jc_save_toStation=%u5929%u6D25%2CTJP; _jc_save_fromDate=-07-22; _jc_save_toDate=-07-22; _jc_save_wfdc_flag=dc'}resp = requests.get(url,headers=headers) #请求的结果为响应#设置响应的编码格式,不然会发生乱码resp.encoding = 'utf-8'print(resp.text)return resp#提取数据def parse_json(resp):json_ticket = resp.json()#将响应结果转成jsondata_lst = json_ticket['data']['result']d = data_lst[0].split('|')print(d)#获取车次的列表,车次的信息中间是用|进行分割,所以#遍历每一个车次信息#for item in data_lst:# item.split('|')def start():#调用函数parse_json(send_request())if __name__ == "__main__":start()#启动爬虫

如果运行程序出现报错:不能转为json格式

说明现在的cookie使用的次数过多了,不好使了,需要刷新一下,然后重新判断获取相应的字符串(发送的请求过于频繁的时候会返回过来html,过一段时间再对此进行操作)

接下来分析相应的json格式

发现这一个车次信息之中既没有显示北京的相应字样,也没有显示天津的对应字样,说明始发站与终点站被编码过,编码的字段在下面的这个位置之中

这些数据也不是凭空出现的,而是一个js数据,在js中选中stationname会出现相应的信息

此时需要针对json格式的数据进行解析,然后通过正则表达式分析出地名以及对应的英文字符串

#编写python代码,模拟浏览器向服务器发送请求,安装一个第三方模块requestsimport requestsimport redef send_request():#请求:url,方式,由于该url请求方式为get,所以使用requests中的get方法url = '/otn/leftTicket/query?leftTicketDTO.train_date=-07-22&leftTicketDTO.from_station=BJP&leftTicketDTO.to_station=TJP&purpose_codes=ADULT'headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36','Cookie': '_uab_collina=159538369140806450712937; JSESSIONID=FA4A5E1D961C469DDD0AA8F8B557BA03; BIGipServerotn=49283594.50210.0000; RAIL_EXPIRATION=1595693855055; RAIL_DEVICEID=lrRDw-T9TpJ4Bq7322B2k-yVhvP9ss_szNaNB9KMlQFe86NDdNqZprmY1YbIisXUs8TbVKvi37n7QJj08Uip6Uf7weeFkz_zF_6OYbK4OfL-XsXkQrGNcaddC5KsIU0ffZYkTmiusPnehxeEX1O5ya3R7mGGr0Q7; BIGipServerpool_passport=200081930.50215.0000; route=495c805987d0f5c8c84b14f60212447d; _jc_save_fromStation=%u5317%u4EAC%2CBJP; _jc_save_toStation=%u5929%u6D25%2CTJP; _jc_save_fromDate=-07-22; _jc_save_toDate=-07-22; _jc_save_wfdc_flag=dc'}resp = requests.get(url,headers=headers) #请求的结果为响应#设置响应的编码格式,不然会发生乱码resp.encoding = 'utf-8'print(resp.text)return resp#提取数据def parse_json(resp):json_ticket = resp.json()#将响应结果转成jsondata_lst = json_ticket['data']['result']d = data_lst[0].split('|')print(d)#获取车次的列表,车次的信息中间是用|进行分割,所以#遍历每一个车次信息#for item in data_lst:# item.split('|')def start():#调用函数parse_json(send_request())#获取station_name信息def get_city():url = '/otn/resources/js/framework/station_name.js?station_version=1.9151'headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36','Cookie': '_uab_collina=159538369140806450712937; JSESSIONID=FA4A5E1D961C469DDD0AA8F8B557BA03; BIGipServerotn=49283594.50210.0000; RAIL_EXPIRATION=1595693855055; RAIL_DEVICEID=lrRDw-T9TpJ4Bq7322B2k-yVhvP9ss_szNaNB9KMlQFe86NDdNqZprmY1YbIisXUs8TbVKvi37n7QJj08Uip6Uf7weeFkz_zF_6OYbK4OfL-XsXkQrGNcaddC5KsIU0ffZYkTmiusPnehxeEX1O5ya3R7mGGr0Q7; BIGipServerpool_passport=200081930.50215.0000; route=495c805987d0f5c8c84b14f60212447d; _jc_save_fromStation=%u5317%u4EAC%2CBJP; _jc_save_toStation=%u5929%u6D25%2CTJP; _jc_save_fromDate=-07-22; _jc_save_toDate=-07-22; _jc_save_wfdc_flag=dc'}resp = requests.get(url,headers=headers)resp.encoding='utf-8'#print(resp.text)#数据的提取使用正则表达式station = re.findall(r'([\u4e00-\u9fa5]+)\|([A-Z]+)',resp.text)#将列表转成字典station_data = dict(station)#将键和对应的值互换station_d = {} #空字典,用于将key和value进行交换for item in station_data:station_d[station_data[item]] = itemprint(station_d)#数据提取r'([\u4e00-\u9fa5]+)\|([A-Z]+)#\u4e00-\u9fa5代表所有的中文字符,也就是找到一个中文和#与之对应的英文字符'''if __name__ == "__main__":#start() 启动爬虫程序get_city()

获取到地址对应的字符串之后,

下面的这条数据(以’gt’打头的)就是我拆分之后的结果,

拆分之后的列表索引为3的代表车次,索引为的表示查询起始点,代码如下:

#编写python代码,模拟浏览器向服务器发送请求,安装一个第三方模块requestsimport requestsimport redef send_request():#请求:url,方式,由于该url请求方式为get,所以使用requests中的get方法url = '/otn/leftTicket/query?leftTicketDTO.train_date=-07-22&leftTicketDTO.from_station=BJP&leftTicketDTO.to_station=TJP&purpose_codes=ADULT'headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36','Cookie': '_uab_collina=159538369140806450712937; JSESSIONID=FA4A5E1D961C469DDD0AA8F8B557BA03; BIGipServerotn=49283594.50210.0000; RAIL_EXPIRATION=1595693855055; RAIL_DEVICEID=lrRDw-T9TpJ4Bq7322B2k-yVhvP9ss_szNaNB9KMlQFe86NDdNqZprmY1YbIisXUs8TbVKvi37n7QJj08Uip6Uf7weeFkz_zF_6OYbK4OfL-XsXkQrGNcaddC5KsIU0ffZYkTmiusPnehxeEX1O5ya3R7mGGr0Q7; BIGipServerpool_passport=200081930.50215.0000; route=495c805987d0f5c8c84b14f60212447d; _jc_save_fromStation=%u5317%u4EAC%2CBJP; _jc_save_toStation=%u5929%u6D25%2CTJP; _jc_save_fromDate=-07-22; _jc_save_toDate=-07-22; _jc_save_wfdc_flag=dc'}resp = requests.get(url,headers=headers) #请求的结果为响应#设置响应的编码格式,不然会发生乱码resp.encoding = 'utf-8'print(resp.text)return resp#提取数据def parse_json(resp):json_ticket = resp.json()#将响应结果转成jsondata_lst = json_ticket['data']['result']d = data_lst[0].split('|')city = get_city()for item in data_lst:d = item.split('|')print(d[3],city[d[6]],city[d[7]],d[31],d[30],d[13])#print(d[3],d[6],d[31],d[30],d[13])'''d[3]从列表中获取索引为3的表示车次,d[6]查询起始站d[7]查询到达站,d[31] 一等座,d[30]表示二等座,d[13]表示出行时间'''#获取车次的列表,车次的信息中间是用|进行分割,所以#遍历每一个车次信息#for item in data_lst:# item.split('|')def start():#调用函数parse_json(send_request())#获取station_name信息def get_city():url = '/otn/resources/js/framework/station_name.js?station_version=1.9151'headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36','Cookie': '_uab_collina=159538369140806450712937; JSESSIONID=FA4A5E1D961C469DDD0AA8F8B557BA03; BIGipServerotn=49283594.50210.0000; RAIL_EXPIRATION=1595693855055; RAIL_DEVICEID=lrRDw-T9TpJ4Bq7322B2k-yVhvP9ss_szNaNB9KMlQFe86NDdNqZprmY1YbIisXUs8TbVKvi37n7QJj08Uip6Uf7weeFkz_zF_6OYbK4OfL-XsXkQrGNcaddC5KsIU0ffZYkTmiusPnehxeEX1O5ya3R7mGGr0Q7; BIGipServerpool_passport=200081930.50215.0000; route=495c805987d0f5c8c84b14f60212447d; _jc_save_fromStation=%u5317%u4EAC%2CBJP; _jc_save_toStation=%u5929%u6D25%2CTJP; _jc_save_fromDate=-07-22; _jc_save_toDate=-07-22; _jc_save_wfdc_flag=dc'}resp = requests.get(url,headers=headers)resp.encoding='utf-8'#print(resp.text)#数据的提取使用正则表达式station = re.findall(r'([\u4e00-\u9fa5]+)\|([A-Z]+)',resp.text)#将列表转成字典station_data = dict(station)#将键和对应的值互换station_d = {} #空字典,用于将key和value进行交换for item in station_data:station_d[station_data[item]] = item#print(station_d)return station_d#数据提取r'([\u4e00-\u9fa5]+)\|([A-Z]+)#\u4e00-\u9fa5代表所有的中文字符,也就是找到一个中文和#与之对应的英文字符'''if __name__ == "__main__":start() #启动爬虫程序#get_city()

得到所有相应的车次信息

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。