技术小白爬虫实践1-爬取某社交平台用户数据

时间:2024-03-22 13:30:34

最近学习了python的requests库,粗略学习了下正则匹配,就想找个项目练练手。很凑巧,连接fiddler测试的过程中,刷了会某社交平台,抓到了不少请求。通过分析,发现该平台用户id是从1开始递增的,请求中的access_token值应该是通过某些规则生成的32位加密编码。切换id,access_token不变的情况可以访问不同用户的个人主页。主页中含有用户信息,包括居住城市、姓名、公司、职位、毕业学校、头像、用户标签、他人评价等等。比较敏感的信息如电话号码,含无疑问做了加密,但是仅靠这些信息也足以定位到一个个具体的用户,算是有价值的信息。先贴张图,看下效果,再具体讲一下实现原理。
技术小白爬虫实践1-爬取某社交平台用户数据

目前爬到了600多条用户用户,然后遇到了爬虫的最大阻碍-反爬。当然有反爬就有克制反爬的办法,这是后话。
引入的库

import requests
import re
import xlrd
import random
from xlutils.copy import copy
import time

requests用来获取网页信息,re正则匹配,xlrd和xlutils.copy将爬到的信息写入一个excel文档,time和random是为了生成随机数字做等待用,避免爬取频繁被限制。

1.获取网页信息

def getHtml(url):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36"
    }

    html = requests.get(url, headers=headers).text

    return html

只伪造了一个UA头,发现是可以爬到信息的

2.其中一个字段-姓名的获取函数

def getname(html):
    name_reg = r'"name":"(.*?)"'
    name_patten = re.compile(name_reg)
    name = re.findall(name_patten, html)
    if len(name):
        return name[0]
    else:
        return "/"

通过正则匹配,获取到姓名的一个列表,第一条数据就代表了用户姓名,直接拿到。某些用户id不存在,则返回"/"填充位置。原本想直接去掉这种无效信息,但是想看看比如1000个用户,无效的大概有多少,就直接做位置填充了。其他信息:岗位、居住地、公司等一样,如上图,我只取了姓名,居住地,职位,公司,头像等。

3.写入现有的excel文档

def xlxs_modify(i, name):
    file_xl = xlrd.open_workbook(r'...')
    xlxs = copy(file_xl)
    write_xlxs = xlxs.get_sheet(0)
    write_xlxs.write(i, 0, name1)
     xlxs.save(r'...')

将真正匹配到的姓名等字段写入文档,从第一列顺序写入

4.跑循环,写入数据

for i in range(500,3000):
    j = i+1
    url = "https://.../contact/basic/%s?"%j
    ....
    all = xlxs_modify(j, name, province, city, company, compos, school, avatar)
    x = random.randint(1, 2)
    time.sleep(x)

简单加个随机等待时间,避免被封。

写到这里爬虫的部分就差不多了,因为爬到600多条数据的时候抓取到的网页信息一直是“休息一会儿”,原来是中了反爬的套。然后我通过headers头加入动态的虚拟ip,写入cookies,多添加等待时间等发现都不能解决问题。看来很大的几率是通过用户信息触发的,除非切换不同的用户。
该平台是用手机号注册的用户,算是注册门槛较高的方式,但是亦有**之道,Google sms 短信服务,发现外网有大量的免费验证码获取手机号,如下图这种。
技术小白爬虫实践1-爬取某社交平台用户数据

现在你只要注册个多个账户,随机拿接口跑循环,抓取几千上万条实际应该不成问题。