这里先讲下之前遇到的坑,之前想爬取网站上的内容是用python的requests+lxml.etree。用requests从网上获取页面的html源码,然后用etree根据xpath解析路径得到数据。但是有一次用同样的方法爬取12306的数据却死活爬不出来,后来我分析网站的源码,发现12306的网站上的出票情况全都是通过js获取的json数据显示的,我本来打算用requests获得json数据,然后用python的split()提取其中的json,但是再去网站分析数据发现,它下载下来的json数据中票的有无和html模板上的票的种类不是一一对应的,于是我放弃了这种方法。

获取浏览器的数据,进行xpath解析


对于requests无法获取的json数据,我使用selenium+etree来获取。

selenium库

selenium的原理是模拟浏览器解析服务器发送过来的数据,相比于requests库,会多一步浏览器解析的过程。浏览器对服务器数据的解析主要为,加载,解析,渲染三步,因为浏览器对数据的解析,也就造成了,将requests.get获得的数据用浏览器获得的xpath,无法get到自己相要的数据。

selenium的安装方法

pip install selenium

但是在安装完selenium后还需要安装浏览器的驱动,如果用的firefox,就去firefox的官网下载geckodriver。如果用的chrome,就去chrome官网下载chromedriver。然后将解压后的geckodriver.exe,设置环境变量

然后就可以获取在浏览器端看见的html数据了。

下面附上我的代码

代码
1
2
3
4
5
6
7
8
9
10
11
12
from selenium import webdriver
from lxml import etree
from send_message import send_message
option=webdriver.FirefoxOptions()
option.add_argument('-headless')#为了让浏览器在后台运行
browse=webdriver.Firefox(firefox_options=option)
response=browse.get('https://kyfw.12306.cn/otn/leftTicket/init?linktypeid=dc&fs=%E9%87%8D%E5%BA%86%E5%8C%97,CUW&ts=%E9%95%BF%E6%98%A5,CCT&date=2019-02-21&flag=N,N,Y')
html=browse.page_source
html_xpath=etree.HTML(html)
message=html_xpath.xpath('//*[@id="YW_77000K157410"]/text()')[0]#获得了数据
phone_number='+86********'#手机号
send_message(phone_number,message)#发短信到手机

ps: send_message这个包是我自己封装的一个包,主要是为了实现发短信的功能。