一次爬蟲實踐記錄

前言說明:html

公司在2017年3月的時候開發過一個「數據中心」,是將有讚的用戶和訂單信息經過API拉取到本身開發的網站上,再結合咱們本身和用戶溝通的信息,組成一個簡單的用戶管理中心。數據中心雖然簡單,但對咱們意義很是大,它的出現標誌着咱們想要定位一個用戶的時候告別了「辦公室吼一吼」的純人肉方法。node

不過隨着時間的推移,數據中心跟不上咱們的業務發展,咱們想在近期將其從新作一遍,進行一系列大的功能升級。別的都好說,惟一的問題是在過去一年半中,咱們在數據中心添加了大量的信息,好比同窗的微信號、暱稱、他家長的信息、他的訂單備註信息等等。隨着遠良的離職,後來的人已經很難從數據庫中找出這些數據。在和偉鋒探討CRM的時候,我忽然想到了能夠用爬蟲的手段,來將數據中心的數據所有爬取出來。因而便有了下面的代碼,通過斷斷續續兩三天的研究,我終於搞定了代碼,順利爬取了咱們全部超過1萬條的用戶數據。python

這裏作一個技術記錄,中間涉及到的知識點包括:mysql

  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)
相關文章
相關標籤/搜索