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()
得到所有相应的车次信息