网站调用新浪微博内容(Python学习交流:新浪微博反扒去解析网页了)

优采云 发布时间: 2021-10-06 16:20

  网站调用新浪微博内容(Python学习交流:新浪微博反扒去解析网页了)

  欢迎加入Python学习交流QQ群:201044047不小聊!名额有限!如果你不喜欢它,请不要进入!

  Python

  最近事情比较多,所以上周写的新浪微博爬虫被拖到现在,但不得不说新浪微博的反贴,我只想说我真的服了。mysql

  爬取数据前的准备

  跑到右边的老大说,这次没有限制爬取什么内容,但是作为参考,有兴趣的可以做一下:正则表达式

  

  参考思路

  当我看到这个时,我觉得很有趣,我想制作很多。所以我个人的想法是找一个粉丝多的人分析他的分析信息,然后分析他的粉丝的粉丝。等等(最好去感受一下解析初始用户关注的人的粉丝,因为他的粉丝比较多,他关注的人的粉丝肯定不会少),但是后来我想放弃这个想法。真的有很多问题。嗯,我很少说废话。来看看我抓到的信息:sql

  一般来说,只能获得这么多信息。由于很多人的信息不完善,所以很多人先被抓起来进行检测。数据库

  一个基本的想法

  确认了我们要找的信息,下一步就是解析网页(一个大问题即将出现)。在我看来,获取网页的过程中遇到过:1.解析源码,2.catch Package(json),但新浪微博更烦。是在js里面,没有加载(只能用regular或者selenium来模拟浏览器)。看到这里,我想了想,问罗罗盘有没有别的办法。如果它不起作用,我将使用硒。他说还是建议正规化。分析速度更快。硒是最后的选择。无论正确与否,您都可以使用在线测试工具进行定期测试。无需一遍又一遍地运行代码。json

  

  源代码+我的信息

  

  关注 + 粉丝 + 微博

  找到这个资料,盯着源码看了半天,看的头大了,其实是ctrl+f浏览器的快捷方式

  

  搜索栏

  既然我们都知道信息在哪里,那么就该写正则匹配信息了。这个只能慢慢写,可以练习正则表达式。曲奇饼

  URL+粉丝分页问题

  我的主页网址

  我们先来看一个例子:

  这个网址,提醒大家直接使用的时候是看不到首页信息的,但是在代码的测试源码中,我们可以看到位置重定向的链接。#后面的部分替换为&retcode=6102,所以URL应该是:,

  我点击了链接并进行了测试。我看到的内容和第一个链接一样,还有一点。我们以后得到的所有链接都要替换#后面的内容,举个例子:app

  urls = re.findall(r'class=\\"t_link S_txt1\\" href=\\"(.*?)\\"',data)

careUrl = urls[0].replace('\\','').replace('#place','&retcode=6102')

fansUrl = urls[1].replace('\\','').replace('#place','&retcode=6102')

wbUrl = urls[2].replace('\\','').replace('#place','&retcode=6102')

  如果我们不更换它,我们得到它后仍然无法获取源代码。

  粉丝分页问题

  本来想可以解析我的一个粉丝,获取大量数据,但是还是卡在系统限制(爬的时候,第五页后就回不来数据了)dom

  

  系统限制

  看到这个,系统限制了,这是什么,嗯,我只能看到100个粉丝的信息,只能继续写下去了。因此,我们只需要考虑5页的数据。如果总页数大于 5 页,则按 5 页处理。如果页数少于5页,则可以正常写入。:

  在这两个 URL 之后,我们可以看到区别在后半部分。除了用&retcode=6102替换#后面的部分,我还要稍微改动一下,下面是哪个?进行后续更改后,我们将从第二页构建 URL。

  示例代码:

  urls = ['http://weibo.com/p/1005051497035431/follow?relate=fans&page={}&retcode=6102'.format(i) for i in range(2,int(pages)+1)]

  那么URL分页问题就解决了,可以说是解决了一个问题。如果你认为新浪微博只有这些反扒,那就太天真了,我们继续往下看。

  布满荆棘的路

  整个收购过程都是各种坑。之前我们主要讲了数据获取的方法以及URL和粉丝页面的问题。现在让我们来看看新浪微博上的一些反采摘:

  首先,请求时必须添加cookie进行身份验证。这很正常,但在这里真的不是灵丹妙药。因为cookies也是有生命周期的,所以获取我的信息是没有问题的。但是,在获取粉丝页面信息时,出现了过期问题。怎么解决,想了半天,终于通过selenium模拟登录解决了。这个后面会详细解释,总之这点要注意。

  然后,还有一点是,并不是每个人的源代码都是一样的。我怎样才能比较它?登录微博后,查看你的粉丝页面。源代码与您搜索的用户的源代码相同。不,其他的源代码信息也不同,我真的指出一件事,大公司很棒。

  

  用户源代码

  

  自己的源代码

  通过自学应该可以看出区别,所以新浪微博整体来说还是比较难爬的。

  代码

  代码部分确实组织得不好,问题也很多,但是我可以贴出核心代码供大家参考讨论(感觉自己写的有点乱)

  说一下代码结构,两个主类和三个辅助类:

  两个主要类:第一个类解析粉丝id,另一个类解析详细信息(解析时会判断id是否已经解析)

  三个辅助类:第一个模拟登录并返回cookies(在爬取数据的过程中,好像只调用了一次,多半是代码问题),第二个辅助类返回一个随机代理,第三个辅助类类将我的信息写入 mysql。

  下面我把两个主类的源码贴出来,去掉辅助类的其余信息,还是可以运行的。

  1.fansSpider.py

<p>#-*- coding:utf-8 -*- import requests import re import random from proxy import Proxy from getCookie import COOKIE from time import sleep from store_mysql import Mysql from weibo_spider import weiboSpider class fansSpider(object): headers = [ {"user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"}, {"user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"}, {"user-agent": "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11"}, {"user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6"}, {"user-agent": "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6"}, {"user-agent": "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1"}, {"user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5"}, {"user-agent": "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5"}, {"user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3"}, {"user-agent": "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3"}, {"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3"}, {"user-agent": "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3"}, {"user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3"}, {"user-agent": "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3"}, {"user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3"}, {"user-agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3"}, {"user-agent": "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3"}, {"user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"}, {"user-agent": "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"} ] def __init__(self): self.wbspider = weiboSpider() self.proxie = Proxy() self.cookie = COOKIE() self.cookies = self.cookie.getcookie() field = ['id'] self.mysql = Mysql('sinaid', field, len(field) + 1) self.key = 1 def getData(self,url): self.url = url proxies = self.proxie.popip() print self.cookies print proxies r = requests.get("https://www.baidu.com", headers=random.choice(self.headers), proxies=proxies) while r.status_code != requests.codes.ok: proxies = self.proxie.popip() r = requests.get("https://www.baidu.com", headers=random.choice(self.headers), proxies=proxies) data = requests.get(self.url,headers=random.choice(self.headers), cookies=self.cookies, proxies=proxies,timeout=20).text #print data infos = re.findall(r'fnick=(.+?)&f=1\\',data) if infos is None: self.cookies = self.cookie.getcookie() data = requests.get(self.url, headers=random.choice(self.headers), cookies=self.cookies, proxies=proxies, timeout=20).text infos = re.findall(r'fnick=(.+?)&f=1\\', data) fans = [] for info in infos: fans.append(info.split('&')[0]) try: totalpage = re.findall(r'Pl_Official_HisRelation__6\d+\\">(\d+)(\d+)(.*?)(.+?)(\d*)(.+?)(.+?)

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线