资讯专栏INFORMATION COLUMN

一次爬虫实践记录

hzx / 3075人阅读

摘要:在和伟锋探讨的时候,我突然想到了可以用爬虫的手段,来将数据中心的数据全部爬取出来。这里做一个技术记录,中间涉及到的知识点包括如何通过中的,以及维持登陆状态,以爬取不同的需要登陆以后才能查看的网页。

前言说明:

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

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

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

如何通过Network中的authorization,以及requests.session()维持登陆状态,以爬取不同的需要登陆以后才能查看的网页。这里面有个坑,就是我先用了session的方法来试图解决问题,但是怎么试都总是失败,反复查询后发现发现数据中心是用node.js来写的,而这样的网页用的是token来验证身份,session()那套行不通。最后我在头信息中发现authorization,直接粘到headers的信息才解决问题的;

查看网页源代码,如果你需要的信息不在源代码中,那就说明要找的内容在JS文件中,在开发者模式下找到Network中的XHR或者JS,里面一般都会有某个JS文件包含你要的信息(header包含头信息,preview包含要爬取的信息,最上面的request URL则是要爬取内容所需要的网址信息)。

复习了json的使用方法。另外,不管是python还是json,爬取的关键都是找到循环点,因为循环点意味着有规律循环的开始;

复习了在python中打开、写入csv文件的方式;

复习了在python中连接数据库的知识;Python3 MySQL 数据库连接 - PyMySQL 驱动

学习了try...except的用法:将可能出现bug的代码写入try的部分,然后在except那里写入报错类型和报错的提示。报错提示可以根据需要自定义。这样的好处是程序出现bug的时候不会报错终止,而是会给出报错提示以后继续后面的运行,直到结束。(Python)异常处理try...except、raise

复习列表构造的知识;

简单学习了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)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44974.html

相关文章

  • Evil Python

    摘要:用将倒放这次让我们一个用做一个小工具将动态图片倒序播放发现引力波的机构使用的包美国科学家日宣布,他们去年月首次探测到引力波。宣布这一发现的,是激光干涉引力波天文台的负责人。这个机构诞生于上世纪年代,进行引力波观测已经有近年。 那些年我们写过的爬虫 从写 nodejs 的第一个爬虫开始陆陆续续写了好几个爬虫,从爬拉勾网上的职位信息到爬豆瓣上的租房帖子,再到去爬知乎上的妹子照片什么的,爬虫...

    Turbo 评论0 收藏0
  • 爬虫攻防实践

    摘要:之前在学校曾经用过的方法做过一些爬虫脚本来玩,从正式转前端之后,出于兴趣,我对爬虫和反爬虫又做了一些了解,并且做了一些爬虫攻防的实践。爬虫脚本通常会很频繁的进行网络请求,比如要爬取豆瓣排行榜的电影,就会连续发送个网络请求。 之前在学校曾经用过request+xpath的方法做过一些爬虫脚本来玩,从ios正式转前端之后,出于兴趣,我对爬虫和反爬虫又做了一些了解,并且做了一些爬虫攻防的实践...

    wanglu1209 评论0 收藏0
  • 爬虫攻防实践

    摘要:之前在学校曾经用过的方法做过一些爬虫脚本来玩,从正式转前端之后,出于兴趣,我对爬虫和反爬虫又做了一些了解,并且做了一些爬虫攻防的实践。爬虫脚本通常会很频繁的进行网络请求,比如要爬取豆瓣排行榜的电影,就会连续发送个网络请求。 之前在学校曾经用过request+xpath的方法做过一些爬虫脚本来玩,从ios正式转前端之后,出于兴趣,我对爬虫和反爬虫又做了一些了解,并且做了一些爬虫攻防的实践...

    xiangzhihong 评论0 收藏0
  • SegmentFault 助力 PyCon2014 China

    摘要:月日,助力在北京举办全球最盛大的年度聚会,国内外顶尖的工程师做了很精彩的分享和互动,现场多名爱好者参与了此次技术主题盛宴。后续会有更多现场照片持续更新 11月15日,SegmentFault 助力PyCon China 在北京举办全球 Pythoneer 最盛大的年度聚会,国内外顶尖的Python 工程师做了很精彩的分享和互动,现场300多名python爱好者参与了此次技术主题盛宴。 ...

    junbaor 评论0 收藏0
  • python爬虫实践: 豆瓣小组命令行客户端

    摘要:主要特性前一阵重新组织了一下代码加了命令行信息用起来更方便了一些初步实现了豆瓣小组及用户相关的爬虫和请求基于和没有用高阶的诸如之类的爬虫工具所有的命令行输出都是标准的格式可以使用操作安装仅支持使用两种命令模式客户端接口调用和豆瓣模块接口 主要特性 前一阵重新组织了一下代码, 加了命令行help信息, 用起来更方便了一些 初步实现了豆瓣小组及用户相关的API爬虫和请求 基于reques...

    golden_hamster 评论0 收藏0

发表评论

0条评论

hzx

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<