最近学习了python的requests库,粗略学习了下正则匹配,就想找个项目练练手。很凑巧,连接fiddler测试的过程中,刷了会某社交平台,抓到了不少请求。通过分析,发现该平台用户id是从1开始递增的,请求中的access_token值应该是通过某些规则生成的32位加密编码。切换id,access_token不变的情况可以访问不同用户的个人主页。主页中含有用户信息,包括居住城市、姓名、公司、职位、毕业学校、头像、用户标签、他人评价等等。比较敏感的信息如电话号码,含无疑问做了加密,但是仅靠这些信息也足以定位到一个个具体的用户,算是有价值的信息。先贴张图,看下效果,再具体讲一下实现原理。
目前爬到了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 短信服务,发现外网有大量的免费验证码获取手机号,如下图这种。
现在你只要注册个多个账户,随机拿接口跑循环,抓取几千上万条实际应该不成问题。