一次爬虫实践记录

news/2024/7/19 11:34:37 标签: 爬虫, 数据库, json

前言说明:

公司在2017年3月的时候开发过一个「数据中心」,是将有赞的用户和订单信息通过API拉取到自己开发的网站上,再结合我们自己和用户沟通的信息,组成一个简单的用户管理中心。数据中心虽然简单,但对我们意义非常大,它的出现标志着我们想要定位一个用户的时候告别了“办公室吼一吼”的纯人肉方法。

不过随着时间的推移,数据中心跟不上我们的业务发展,我们想在近期将其重新做一遍,进行一系列大的功能升级。别的都好说,唯一的问题是在过去一年半中,我们在数据中心添加了大量的信息,比如同学的微信号、昵称、他家长的信息、他的订单备注信息等等。随着远良的离职,后来的人已经很难从数据库中找出这些数据。在和伟锋探讨CRM的时候,我突然想到了可以用爬虫的手段,来将数据中心的数据全部爬取出来。于是便有了下面的代码,经过断断续续两三天的研究,我终于搞定了代码,顺利爬取了我们所有超过1万条的用户数据。

这里做一个技术记录,中间涉及到的知识点包括:

  1. 如何通过Network中的authorization,以及requests.session()维持登陆状态,以爬取不同的需要登陆以后才能查看的网页。这里面有个坑,就是我先用了session的方法来试图解决问题,但是怎么试都总是失败,反复查询后发现发现数据中心是用node.js来写的,而这样的网页用的是token来验证身份,session()那套行不通。最后我在头信息中发现authorization,直接粘到headers的信息才解决问题的;
  2. 查看网页源代码,如果你需要的信息不在源代码中,那就说明要找的内容在JS文件中,在开发者模式下找到Network中的XHR或者JS,里面一般都会有某个JS文件包含你要的信息(header包含头信息,preview包含要爬取的信息,最上面的request URL则是要爬取内容所需要的网址信息)。
  3. 复习了json的使用方法。另外,不管是python还是json,爬取的关键都是找到循环点,因为循环点意味着有规律循环的开始;
  4. 复习了在python中打开、写入csv文件的方式;
  5. 复习了在python中连接数据库的知识;Python3 MySQL 数据库连接 - PyMySQL 驱动
  6. 学习了try...except的用法:将可能出现bug的代码写入try的部分,然后在except那里写入报错类型和报错的提示。报错提示可以根据需要自定义。这样的好处是程序出现bug的时候不会报错终止,而是会给出报错提示以后继续后面的运行,直到结束。(Python)异常处理try...except、raise
  7. 复习列表构造的知识;
  8. 简单学习了SQL的基本操作语句 SQL基本语法
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)

http://www.niftyadmin.cn/n/970322.html

相关文章

51nod1636 教育改革

1636教育改革题目来源: CodeForces基准时间限制:1秒 空间限制:131072KB 分值:20难度:3级算法题收藏关注取消关注最近A学校正在实施教育改革。 一个学年由n天组成。A学校有m门课程,每天学生必须学习一门课,一…

BZOJ 1059: [ZJOI2007]矩阵游戏【二分图匹配】

1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec Memory Limit: 162 MB Description 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏——矩阵游戏。矩阵游戏在一个N *N黑白方阵进行(如同国际象棋一般,只是颜色…

在帧中继上运行RIP

帧中继交换机配置 enable config terminal no cdp run no ip domain-lookup line console 0 no exec-t logg syn enable secret cisco line vty 0 4 password cisco login host frame-relay frame-relay switch int s0/0 encapsulation frame-relay frame-relay lmi-type ansi …

功能发布:大数据驱动业务决策,CDN实时日志重磅上线

背景 CDN是非常重要的互联网基础设施,用户可以通过CDN,快速的访问网络中各种图片,视频等资源。在访问过程中,CDN会产生大量的日志数据,而随着如今越来越复杂的网络环境变化,和业务的迅速增长,日…

BZOJ 1060: [ZJOI2007]时态同步【树形DP】

1060: [ZJOI2007]时态同步 Time Limit: 10 Sec Memory Limit: 162 MB Description 小Q在电子工艺实习课上学习焊接电路板。一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字1,2,3….进行标号。电路板的各个节点由若干不相交的导线相连接&…

创建.gitignore文件忽略不需要提交的文件

在所需要创建的地方右键单击,点击Git Bash here在出来的命令行中输入 touch .gitignore然后在生成的.gitignore文件中添加需要忽略的文件名即可

判断是否为二分图的两种算法 dfs/bfs

判断是否为二分图的两种算法 dfs/bfs判断一个无向图是不是二分图,使用染色法.对每个顶点的相邻顶点染与顶点不同的颜色。如果染过色且与顶点颜色相同,则不是二分图。 /* author: 熊谦智判断该图是否为二分图 1:判断无向图是否有环: 如果图g有环&#xf…

你想见的Java大神都在这里了,提问大佬必回

云栖社区特别邀请了6位Java专家来为社区小伙伴解答难题 你也有问题吗,快来——》向专家提问 整理的专家已回复优质问题: 问:刚学完html/css/js的新手学习servlet、jsp需要注意哪些问题?我要做一个读书网的jsp小程序,要…