歡迎光臨
每天分享高質量文章

Python不僅寫程式碼優雅,也能幫你優雅的找到物件

很多人認為程式員是格子衫、油膩的頭髮或者是沒有頭髮、常年背著電腦包、帶著眼睛、嚴重的黑眼圈的形象,這樣怎麼可能找到女朋友?!

其實程式員可以是這樣的

也可以這樣的

而我們更加可以用技術來識別並分析那個女孩更適合我們,也可以分析喜歡的女孩要怎樣才能追上她

Requests 庫爬取「我主良緣」網站

程式邏輯

利用 requests 庫對標的站點進行資料的抓取。

在對抓取的資料進行處理,篩選出自己想要的資料資訊。

最後儲存相應的資料資訊到資料庫中。

解析網站

設定年齡

設定性別引數

設定身高引數

設定薪水引數

查詢符合條件的資料

圖片儲存

儲存資料到monogo資料庫

完整程式碼

import requests
import xlwt
import xlsxwriter
import os
from hashlib import md5
from urllib.parse import urlencode
from config import *
import pymongo

# 定義 mongo 連結變數
clinet = pymongo.MongoClient(MONGO_URL)
# 定義 mongo 資料庫變數
db = clinet[MONGO_DB]

'''
解析網站
'''

def get_one(page, startage, endage, gender, startheight, endheight, salary):
    # 設定請求頭
    essay-headers = {
        'Referer''http://www.lovewzly.com/jiaoyou.html',
        'User - Agent''Mozilla / 5.0(Windows NT 10.0;WOW64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 66.0.3359.170Safari / 537.36'
    }

    # 設定請求引數
    params = {
        # 頁數
        'page':page,
        # 起始年齡
        'startage': startage,
        # 截止年齡
        'endage':endage,
        # 性別
        'gender':gender,
        # 所在城市的編號
        'cityid':'52',
        # 起始身高
        'startheight':startheight,
        # 終止身高
        'endheight':endheight,
        # 是否結婚
        'marry':'1',
        # 教育水平
        'educatin':'40',
        # 工資薪水
        'salary':salary
    }

    # 網站連結
    base_url = 'http://www.lovewzly.com/api/user/pc/list/search?'
    # 拼接請求引數
    url = base_url + urlencode(params)
    # 除錯資訊
    print(url)
    while True:
        try:
            # 利用 requests 庫請求標的地址
            response = requests.get(url, essay-headers=essay-headers)
            # 判斷請求的結果是否有效
            if response.status_code == 200:
                # 傳回 json 資料
                return response.json()
        except ConnectionError:
            return None

'''
設定年齡
'''

def query_age():
    # 終端輸入年齡
    age = input('請輸入期望對方年齡(如:20):')
    # 年齡區間進行判斷
    if 21 <= int(age) <= 30:
        startage = 21
        endage = 30
    elif 31 <= int(age) <= 40:
        startage = 31
        endage = 40
    elif 41 <= int(age) <= 50:
        startage = 41
        endage = 50
    else:
        startage = 0
        endage = 0
    # 傳回起始年齡和終止年齡
    return startage, endage

'''
設定性別引數
'''

def query_sex():
    '''性別篩選'''
    # 終端性別字串的輸入
    sex = input('請輸入期望對方性別(如:女):')
    # 對輸入的資訊進行判斷
    if sex == '男':
       gender = 1
    else:
       gender = 2

    # 傳回性別對應的數字
    return gender
'''
設定身高引數
'''

def query_height():
    '''身高篩選'''
    # 終端輸入身高資訊
    height = input('請輸入期望對方身高(如:162):')
    # 身高區域進行判斷
    if 151 <= int(height) <= 160:
        startheight = 151
        endheight = 160
    elif 161 <= int(height) <= 170:
        startheight = 161
        endheight = 170
    elif 171 <= int(height) <= 180:
        startheight = 171
        endheight = 180
    elif 181 <= int(height) <= 190:
        startheight = 181
        endheight = 190
    else:
        startheight = 0
        endheight = 0

    # 傳回對應的起始身高和終止身高
    return startheight, endheight

'''
設定薪水引數
'''

def query_money():
    '''待遇篩選'''
    # 終端輸入薪水區間
    money = input('請輸入期望的對方月薪(如:8000):')

    # 薪水區間進行判斷
    if 2000 <= int(money) 5000:
        salary = 2
    elif 5000 <= int(money) 10000:
        salary = 3
    elif 10000 <= int(money) <= 20000:
        salary = 4
    elif 20000 <= int(money):
        salary = 5
    else:
        salary = 0
    # 傳回薪水引數
    return salary

'''
查詢符合條件的資料
'''

def query_data():
    print('請輸入你的篩選條件, 開始本次姻緣')
    # 獲取終端輸入的性別
    gender = query_sex()
    # 獲取終端輸入的起始身高和終止身高
    startheight, endheight = query_height()
    # 獲取終端輸入的開始年齡和終止年齡
    startage, endage = query_age()
    # 獲取終端輸入的薪水
    salary = query_money()
    # 迴圈遍歷 10 次,即抓取 10 次頁面的資料
    for i in range(110):
        # 獲取抓取到的 json 資料
        json = get_one(i, startage, endage, gender, startheight, endheight, salary)
        # 迴圈遍歷每個 json 資料
        for item in get_person(json):
            # 儲存到 monogo 資料庫
            save_to_monogo(item)
            # 儲存圖片
            save_image(item)
'''
圖片儲存
'''

def save_image(item):
    # 判斷當前目錄是否存在 images2 檔案夾
    if not os.path.exists('images2'):
        # 建立 images2 檔案夾
        os.mkdir('images2')
    try:
        # 獲得 image 資訊
        image_url = item.get('avatar')
        # 利用 requests 請求圖片地址
        response = requests.get(image_url)
        # 判斷請求的地址是否有效
        if response.status_code == 200:
            # 設定圖片儲存地址
            file_path = '{0}/{1}.{2}'.format('images2', md5(response.content).hexdigest(), 'jpg')
            # 判斷檔案是否已經存在
            if not os.path.exists(file_path):
                # 開啟對應的檔案
                with open(file_path, 'wb')as f:
                    # 儲存圖片資訊
                    f.write(response.content)
            else:
                # 輸出圖片儲存成功資訊
                print('Already Downloaded', file_path)
    except requests.ConnectionError:
        # 輸出圖片儲存失敗資訊
        print('Failed to save image')

'''
儲存資料到 monogo 資料庫
'''

def save_to_monogo(result):
    try:
        # 判斷儲存是否成功
        if db[MONGO_TABLE].insert(result):
            # 儲存成功輸入相應資訊
            print('儲存到 MONGODB 成功', result)
    except Exception:
        # 儲存失敗輸出相應資訊
        print('儲存到 MONGODB 失敗', result)

# 解析資料
def get_person(json):
    # 判斷 json 是否為空
    if json:
        # 獲取 data 資料
        data = json.get('data').get('list')
    else:
        # 輸出錯誤資訊
        print('沒有符合你的條件')
    if data:
        # 迴圈遍歷 data 資料,重新構造新的字典
        for person in data:
            yield {
                # 使用者 id
                'userid':person.get('userid'),
                # 使用者名稱
                'username': person.get('username'),
                # 性別
                'gender': person.get('gender'),
                # 出現日期
                'birthdayyear': person.get('birthdayyear'),
                # 身高
                'height': person.get('height'),
                # 省份
                'province': person.get('province'),
                # 教育程度
                'education': person.get('education'),
                # 簽名
                'monolog': person.get('monolog'),
                # 圖片
                'avatar':person.get('avatar')
            }

def main():
    query_data()

if __name__ == '__main__':
    main()

作者:痴海

源自:

https://juejin.im/post/5b08b7ccf265da0db2514ffc

贊(0)

分享創造快樂