爬了世紀(jì)佳緣后發(fā)現(xiàn)了一個(gè)秘密

文 |?某某白米飯
來源:Python 技術(shù)「ID: pythonall」

今天在知乎上看到一個(gè)關(guān)于【世紀(jì)佳緣找對(duì)象靠譜嗎?】的討論,其中關(guān)注的人有 1903,被瀏覽了 1940753 次,355 個(gè)回答中大多數(shù)都是不靠譜。用 Python 爬取世紀(jì)佳緣的數(shù)據(jù)是否能證明它的不靠譜?

數(shù)據(jù)抓取
在 PC 端打開世紀(jì)佳緣網(wǎng)站,搜索 20 到 30 歲、不限地區(qū)的女朋友

翻了幾頁(yè)找到一個(gè) search_v2.php 的鏈接,它的返回值是一個(gè)不規(guī)則的 json 串,其中包含了昵稱、性別、是否婚配、匹配條件等等

點(diǎn)開 Hearders 拉到最下面,在它的參數(shù)中 sex 是性別、stc 是年齡、p 是分頁(yè)、listStyle 是有照片

通過 url + 參數(shù)的 get 方式,抓取了 10000 頁(yè)的數(shù)據(jù)總共 240116

需要安裝的模塊有 openpyxl,用于過濾特殊的字符
#?coding:utf-8
import?csv
import?json
import?requests
from?openpyxl.cell.cell?import?ILLEGAL_CHARACTERS_RE
import?re
line_index?=?0
def?fetchURL(url):
???
????headers?=?{
????????'accept':?'*/*',
????????'user-agent':?'Mozilla/5.0?(Windows?NT?10.0;?Win64;?x64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/86.0.4240.75?Safari/537.36',
????????'Cookie':?'guider_quick_search=on;?accessID=20201021004216238222;?PHPSESSID=11117cc60f4dcafd131b69d542987a46;?is_searchv2=1;?SESSION_HASH=8f93eeb87a87af01198f418aa59bccad9dbe5c13;?user_access=1;?Qs_lvt_336351=1603457224;?Qs_pv_336351=4391272815204901400%2C3043552944961503700'
????}
????r?=?requests.get(url,?headers=headers)
????r.raise_for_status()
????return?r.text.encode("gbk",?'ignore').decode("gbk",?"ignore")
def?parseHtml(html):
????html?=?html.replace('\\',?'')
????html?=?ILLEGAL_CHARACTERS_RE.sub(r'',?html)
????s?=?json.loads(html,strict=False)
????global?line_index
????userInfo?=?[]
????for?key?in?s['userInfo']:
????????line_index?=?line_index?+?1
????????a?=?(key['uid'],key['nickname'],key['age'],key['work_location'],key['height'],key['education'],key['matchCondition'],key['marriage'],key['shortnote'].replace('\n','?'))
????????userInfo.append(a)
????with?open('sjjy.csv',?'a',?newline='')?as?f:
????????writer?=?csv.writer(f)
????????writer.writerows(userInfo)
if?__name__?==?'__main__':
????
????for?i?in?range(1,?10000):
????????url?=?'http://search.jiayuan.com/v2/search_v2.php?key=&sex=f&stc=23:1,2:20.30&sn=default&sv=1&p='?+?str(i)?+?'&f=select&listStyle=bigPhoto'
????????html?=?fetchURL(url)
????????print(str(i)?+?'頁(yè)'?+?str(len(html))?+?'*********'?*?20)
????????parseHtml(html)
發(fā)現(xiàn)秘密
在處理數(shù)據(jù)去掉重復(fù)的時(shí)候發(fā)現(xiàn)有好多重復(fù)的,還以為是代碼寫的有問題呢,查了好久的 bug 最后才發(fā)現(xiàn)網(wǎng)站在 100 頁(yè)只有的數(shù)據(jù)有好多重復(fù)的,下面兩個(gè)圖分別是 110 頁(yè)數(shù)據(jù)和 111 頁(yè)數(shù)據(jù),是不是有很多熟面孔。
110 頁(yè)數(shù)據(jù)

111 頁(yè)數(shù)據(jù)

過濾重復(fù)后的數(shù)據(jù)只剩下 1872 了,這個(gè)水分還真大
def?filterData():
????filter?=?[]
????csv_reader?=?csv.reader(open("sjjy.csv",?encoding='gbk'))
????i?=?0
????for?row?in?csv_reader:
????????i?=?i?+?1
????????print('正在處理:'?+?str(i)?+?'行')
????????if?row[0]?not?in?filter:
????????????filter.append(row[0])
????print(len(filter))
總結(jié)
世紀(jì)佳緣的數(shù)據(jù)告訴我們網(wǎng)上交友需謹(jǐn)慎。用好 Python 走遍網(wǎng)絡(luò)都不怕。
PS:公號(hào)內(nèi)回復(fù)「Python」即可進(jìn)入Python 新手學(xué)習(xí)交流群,一起 100 天計(jì)劃!
老規(guī)矩,兄弟們還記得么,右下角的 “在看” 點(diǎn)一下,如果感覺文章內(nèi)容不錯(cuò)的話,記得分享朋友圈讓更多的人知道!


【代碼獲取方式】
