最近接到一个朋友的需求,说需要把运单的记录保存下载,因为每个月有上千单快递,手动去复制内容的话,以免跟快递公司有争议的时候,可以做个证明。
我的思路:
1、如何获取动态网页的内容;
2、输入参数肯定有运单号,那就需要从excel中将运单号读取并将其作为参数取网页内容;
3、得到信息后,处理为网页显示的内容;
4、将信息存入到excel。
1、我想着Python实现常规的静态网页抓取,往往是用urllib来获取整个HTML页面,然后从HTML文件中逐字查找对应的关键字
import urllib.request req = urllib.request.Request('http://python.org/') response = urllib.request.urlopen(req) the_page = response.read()
然后我们抓取到的网页是没有动态信息的,因为信息是通过js动态填充到网页的。
2、打开Chrome浏览器,利用Chrome的“开发者工具”来寻找谁是真正的内容提供者,按下键盘F12即可呼出此工具;
3、此时选中“Network”标签,在地址栏中输入此页面“http://www.*.com/cn/sc/dynamic_functions/waybill/#search/bill-number/运单号”,浏览器会分析出此次响应的全过程,而红框内的文件,就是此次响应中,浏览器和web后端的所有通信。
下面是网页的分析过程
然后我们根据每个请求去找到我们想要的信息,如下
接着,我们切换到Header页面,看到了么,是通过Get的方式得到的内容
我们将
说明我们通过这个链接就可以取到我们想要的动态内容。
4、真正的信息源已经被抓到,剩下的就是用Python处理这些页面上的字符了。
5、将单号当做参数传入,得到动态信息后,根据正则将html内容去除,就得到一个json串,然后我们将其当字符串处理即可
def gethtml(waybill=''): req = urllib.request.Request( 'http://www.。。。/service/bills/' + waybill + '/routes?app=bill&lang=sc®ion=cn&translate=') response = urllib.request.urlopen(req) the_page = response.read().decode("utf8") dr = re.compile(r'<[^>]+>', re.S) data = dr.sub('', the_page) strinfo = re.compile('"') rs = strinfo.sub('', data) return rs
如此已经搞定了我们整个需求中最关键的一步。