如何构建一个分布式爬虫:实战篇

优采云 发布时间: 2022-06-05 05:09

  如何构建一个分布式爬虫:实战篇

  

  *敏*感*词*博主具体信息

  这里我们就看到了他的具体信息了。然后,我们看该页面的 url 构造

  我直接 copy 的地址栏的 url。这样做有啥不好的呢?对于老鸟来说,一下就看出来了,这样做的话,可能会导致信息不全,因为可能有些信息是动态加载的。所以,我们需要通过抓包来判断到底微博会通过该 url 返回所有信息,还是需要请求一些 ajax 链接才会返回一些关键信息。这里我就重复一下我的观点:抓包很重要,抓包很重要,抓包很重要!重要的事情说三遍。关于抓包,我在模拟登陆微博和模拟登陆百度云都详细讲过了,这里我就不讲了。

  我们抓完包,发现并没有 ajax 请求。那么可以肯定请求前面的 url,会返回所有信息。我们通过点击鼠标右键,查看网页源代码,然后ctrl a、ctrl c将所有的页面源码保存到本地,这里我命名为personinfo.html。我们用浏览器打开该文件,发现我们需要的所有信息都在这段源码中,这个工作和抓包判断数据是否全面有些重复,但是在我看来是必不可少的,因为我们解析页面数据的时候还可以用到这个 html 文件,如果我们每次都通过网络请求去解析内容的话,那么可能账号没一会儿就会被封了(因为频繁访问微博信息),所以我们需要把要解析的文件保存到本地。

  从上面分析中我们可以得知

  这个 url 就是获取用户数据的 url。那么我们在只知道用户 id 的时候怎么构造它呢?我们可以多拿几个用户 id 来做测试,看构造是否有规律,比如我这里以用户名为网易云音乐的用户做分析,发现它的用户信息页面构造如下

  这个就和上面那个不同了。但是我们仔细观察,可以发现上面那个是个人用户,下面是企业微博用户。我们尝试一下把它们 url 格式都统一为第一种或者第二种的格式

  这样会出现 404,那么统一成上面那种呢?

  这样子的话,它会被重定向到用户主页,而不是用户详细资料页。所以也就不对了。那么该以什么依据判断何时用第一种 url 格式,何时用第二种 url 格式呢?我们多翻几个用户,会发现除了100505之外,还有100305、100206等前缀,那么我猜想这个应该可以区分不同用户。这个前缀在哪里可以得到呢?我们打开我们刚保存的页面源码,搜索100505,可以发现

  

  domain

  微博应该是根据这个来区分不同用户类型的。这里大家可以自己也可以试试,看不同用户的domain是否不同。为了数据能全面,我也是做了大量测试,发现个人用户的 domain 是1005051,作家是100305,其他基本都是认证的企业号。前两个个人信息的 url 构造就是

  后者的是

  弄清楚了个人信息 url 的构造方式,但是还有一个问题。我们已知只有 uid 啊,没有 domain 啊。如果是企业号,我们通过domain=100505会被重定向到主页,如果是作家等(domain=100305 或者 100306),也会被重定向主页。我们在主页把 domain 提取出来,再请求一次,不就能拿到用户详细信息了吗?

  关于如何构造获取用户信息的 url 的相关分析就到这里了。因为我们是在登录的情况下进行数据抓取的,可能在抓取的时候,某个账号突然就被封了,或者由于网络原因,某次请求失败了,该如何处理?对于前者,我们需要判断每次请求返回的内容是否符合预期,也就是看 response url 是否正常,看 response content 是否是 404 或者让你验证手机号等,对于后者,我们可以做一个简单的重试策略,大概代码如下

  <p>@timeout_decorator

  def get_page(url, user_verify=True, need_login=True):

      """

      :param url: 待抓取 url

      :param user_verify: 是否为可能出现验证码的页面(ajax 连接不会出现验证码,如果是请求微博或者用户信息可能出现验证码),否为抓取转发的 ajax 连接

      :param need_login: 抓取页面是否需要登录,这样做可以减小一些账号的压力

      :return: 返回请求的数据,如果出现 404 或者 403,或者是别的异常,都返回空字符串

      """

      crawler.info('本次抓取的 url 为{url}'.format(url=url))

      count = 0<p>    while count

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线