爬虫抓取网页数据(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,增加了更多的等待时间等等,发现问题解决不了。看起来很有可能是用户信息触发的,除非切换到其他用户。

  平台是用手机号注册的用户,是一种注册门槛高的方法,但也有破解的方法。谷歌短信服务,发现网上有大量免费验证码获取手机号,如下图。

  

  现在只需要注册多个账号,随机接口运行循环,抓取上千条记录应该不成问题。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线