前言说明:html
公司在2017年3月的时候开发过一个「数据中心」,是将有赞的用户和订单信息经过API拉取到本身开发的网站上,再结合咱们本身和用户沟通的信息,组成一个简单的用户管理中心。数据中心虽然简单,但对咱们意义很是大,它的出现标志着咱们想要定位一个用户的时候告别了“办公室吼一吼”的纯人肉方法。node
不过随着时间的推移,数据中心跟不上咱们的业务发展,咱们想在近期将其从新作一遍,进行一系列大的功能升级。别的都好说,惟一的问题是在过去一年半中,咱们在数据中心添加了大量的信息,好比同窗的微信号、昵称、他家长的信息、他的订单备注信息等等。随着远良的离职,后来的人已经很难从数据库中找出这些数据。在和伟锋探讨CRM的时候,我忽然想到了能够用爬虫的手段,来将数据中心的数据所有爬取出来。因而便有了下面的代码,通过断断续续两三天的研究,我终于搞定了代码,顺利爬取了咱们全部超过1万条的用户数据。python
这里作一个技术记录,中间涉及到的知识点包括:mysql
Network
中的authorization
,以及requests.session()
维持登录状态,以爬取不一样的须要登录之后才能查看的网页。这里面有个坑,就是我先用了session的方法来试图解决问题,可是怎么试都老是失败,反复查询后发现发现数据中心是用node.js
来写的,而这样的网页用的是token
来验证身份,session()
那套行不通。最后我在头信息中发现authorization
,直接粘到headers
的信息才解决问题的;JS
文件中,在开发者模式下找到Network中的XHR
或者JS
,里面通常都会有某个JS文件包含你要的信息(header包含头信息,preview包含要爬取的信息,最上面的request URL
则是要爬取内容所须要的网址信息)。json
的使用方法。另外,无论是python仍是json,爬取的关键都是找到循环点
,由于循环点意味着有规律循环的开始;try...except
的用法:将可能出现bug的代码写入try的部分,而后在except那里写入报错类型和报错的提示。报错提示能够根据须要自定义。这样的好处是程序出现bug的时候不会报错终止,而是会给出报错提示之后继续后面的运行,直到结束。(Python)异常处理try...except、raise import requests import json import csv import pymysql import time # 从数据库中获取全部的用户ID yz_uids = [] db = pymysql.connect('192.168.31.24','root','root','danci_tddc') # 链接数据库 cursor = db.cursor() # 用cursor 方法获取操做游标 sql = "SELECT * FROM td_crm_customers" # 写sql语句 cursor.execute(sql) # 执行sql语句 data = cursor.fetchall() # 获取数据 for row in data: yz_uid = row[0] yz_uids.append(yz_uid) db.close() # 关闭数据库链接 login_url = 'http://data.testdaily.cn/#!/login' headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36', 'Referer': 'http://data.testdaily.cn/', 'Cookie': 'Hm_lvt_fc5a4042b4f7e4c87111dce89bb04bea=1539932447,1540895924', 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1OGI3ZWU4ZmI2NmVmZjEwMWM5NGVjODgiLCJ1c2VybmFtZSI6Inplbmd5aWNoYW8iLCJleHAiOjE1NDIxODA5OTksImlhdCI6MTU0MTU3NjE5OX0.dl7o4lnPZnfw7e606sVOrW4dYCKOmQJzSsMBHCFPAc4' } # 打开存储的csv文档 f = open('/Users/damo/Desktop/4.csv', 'w+') writer = csv.writer(f) writer.writerow(['user_id', 'wechat', 'nickname', 'majia', 'phone', 'address', 'name', 'tag', 'parentInfo', 'remark', 'update_time','trade_history']) # 获取单个页面的数据 def get_info(url): try: # 读取客户详情页面并获取json数据 res = requests.get(url,headers = headers) json_data = json.loads(res.text) user_id = json_data['user_id'] wechat = json_data['wechat'] if 'nickname' in json_data.keys(): nickname = json_data['nickname'] else: nickname = '' majia = json_data['tdAlias'] phone = json_data['mobile'] address = json_data['address'] name = json_data['name'] tag = json_data['tags'] if 'parentsInfo' in json_data.keys(): parentInfo = json_data['parentsInfo'] else: parentInfo = '' if 'remark' in json_data.keys(): remark = json_data['remark'] else: remark = '' update_time = json_data['update_time'] trade_history = json_data['trades'] writer.writerow([user_id,wechat,nickname,majia,phone,address,name,tag,parentInfo,remark,update_time,trade_history]) # 将数据写入csv文件 except TypeError: print(url + '有问题') if __name__ == '__main__': urls = ['http://data.testdaily.cn/api/customers/{}'.format(i) for i in yz_uids] # 构造列表表达式 for url in urls: get_info(url)