爬虫抓取网页数据(python获取网页信息只伪造了一个UA头(组图))
优采云 发布时间: 2022-04-12 14:14爬虫抓取网页数据(python获取网页信息只伪造了一个UA头(组图))
最近在学习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.其中一个字段——名字的getter函数
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,增加了更多的等待时间等等,发现问题解决不了。看起来很有可能是用户信息触发的,除非切换到其他用户。
平台是用手机号注册的用户,是一种注册门槛高的方法,但也有破解的方法。谷歌短信服务,发现网上有大量免费验证码获取手机号,如下图。
现在只需要注册多个账号,随机接口运行循环,抓取上千条记录应该不成问题。