c爬虫抓取网页数据( 微博会判断到底怎么构造它呢?(一)很重要)

优采云 发布时间: 2021-10-07 00:11

  c爬虫抓取网页数据(

微博会判断到底怎么构造它呢?(一)很重要)

  

  这里我们看到了他的具体信息。然后,我们看一下页面的url结构

  新浪访客系统

  我直接复制了地址栏的URL。这样做有什么不好?对于老手来说,一眼就能看出来。如果这样做,可能会导致信息不完整,因为某些信息可能是动态加载的。因此,我们需要抓包来判断微博是否会通过url返回所有信息,或者需要请求一些ajax链接返回一些关键信息。这里我再说一遍:抓包很重要,抓包很重要,抓包很重要!重要的事情说三遍。关于抓包,我已经详细讨论了新浪微博模拟登录在超详细Python中的实现(大家可以看懂)和百度云盘模拟登录(高级模拟登录)的超详细Python实现。我不会在这里。

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

  从上面的分析我们可以知道

  这个url是获取用户数据的url。那么当我们只知道用户 id 时我们如何构造它呢?我们可以多取几个用户ID进行测试,看看结构是否规则。比如我用一个叫网易云音乐的用户分析,发现它的用户信息页面结构如下

  新浪访客系统

  这个跟上面的不一样。但是仔细观察可以发现,上面的是个人用户,下面的是企业微博用户。让我们尝试将它们的 URL 格式统一为第一种或第二种格式

  /1751195602/关于

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

  在这种情况下,它将被重定向到用户主页而不是用户详细信息页面。所以这是错误的。那么应该根据什么来确定什么时候用第一种url格式,什么时候用第二种url格式呢?如果我们多看几个用户,我们会发现除了`100505`,还有`100305`和`100206`这样的前缀,所以我想这应该可以区分不同的用户。我在哪里可以得到这个前缀?我们打开刚刚保存的页面的源码,搜索`100505`,就可以找到

  

  微博应该以此区分不同的用户类型。在这里你可以自己尝试一下或者看看不同用户的`domain`是否不同。为了让数据全面,我也做了很多测试,发现个人用户的域是`1005051`,作者是`100305`,其他基本都是经过认证的企业号。前两个个人信息的URL结构为

  +uid/info?mod=pedit_more

  后者是

  /uid/关于

  我弄清楚了个人信息url是如何构建的,但还有一个问题。我们知道只有 uid 没有域。如果是企业账号,我们会通过`domain=100505`重定向到首页,如果是作家等(domain=100305或100306),我们也会被重定向到首页。我们从主页中提取域,如果您再次请求,您将无法获得用户详细信息吗?

  关于如何构造获取用户信息的URL的相关分析到此为止。因为我们是在登录的时候抓取数据,所以有可能是在抓取过程中某个账号突然被封了,或者某个请求因为网络原因失败了。我该怎么办?对于前者,我们需要判断每个请求返回的内容是否符合预期,即响应url是否正常,响应内容是否为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(&#39;本次抓取的url为{url}&#39;.format(url=url))

count = 0

while count

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线