输入关键字 抓取所有网页(根据关键词抓取新浪微博的数据,通过网页抓取的方法)

优采云 发布时间: 2022-01-27 17:02

  输入关键字 抓取所有网页(根据关键词抓取新浪微博的数据,通过网页抓取的方法)

  根据关键词抓取新浪微博1.背景

  可能很多人都遇到过想通过一些关键词获取新浪微博数据。目前,有两种方式。

  使用官方api

  官方api的优点是使用简单方便。但是有两个问题。

  这里还是提供了一个api的地址、参数和示例。令牌可以替换为您自己的。以下代码仅供参考

  import requestsurl = 'https://api.weibo.com/2/search/topics.json'"""access_token true string 采用OAuth授权方式为必填参数,OAuth授权后获得。q true string 搜索的话题关键字,必须进行URLencode,utf-8编码。count false int 单页返回的记录条数,默认为10,最大为50。page false int 返回结果的页码,默认为1。"""load = { 'access_token': '2.00AqpTsHXXXXXXXXXXXXXXXXXXXXX', 'q': '新冠', 'count': 50, 'page': 2}html = requests.get(url, params=load)print(html.json())

  从网络爬取

  这个方法是我们文章文章的重点。优点是不需要获取token,二来获取的数据量比较大。但缺点也明显比较麻烦。本文还将详细分析每个步骤,以使爬取变得容易。

  2. 分析目标网站

  分析目标网站,输入任意关键词进行搜索,可以在搜索栏右侧看到高级搜索选项,如下图

  

  微博高级搜索

  我们先不设置参数,调用 f12 看看在搜索过程中可能会产生哪些请求(如下图所示)。

  这是我们需要的数据。很明显,这是一个get请求,里面收录了几个参数。我们可以先猜测一下这些参数的含义。

  很容易看出,“q”绝对代表了你需要搜索的字段。目前还不清楚“typeall”、“suball”和“Refer”分别代表什么,但没关系,我们可以通过更改参数再次请求来获取更多信息。

  

  f12分析

  我们更改参数,空间范围设置为北京,时间范围设置为2020-05-01 0:00 - 2020-05-02 23:00,同时翻到第8页。再次请求我们可以得到下面的数据。

  我们可以看到,区域绝对代表了空间范围,下面的习惯:11:1000代表北京。timescope 表示时间范围,custom:2020-05-01-0:2020-05-02:23 表示我们设置的时间范围。page 绝对是页数。剩下的三个参数不影响我们整个结果(可能是设置了爬取的类型,读者可以自己试一试),暂时不用担心。

  至此,我们已经分析了代表整个请求的参数的含义。接下来,我们可以考虑如何从页面中提取我们需要的信息。

  

  3. 页面解析与代码编写3.1 爬取前的准备3.2 定位元素

  通过查看原件,我们可以定位每条推文的位置,并找到元素的唯一定位标签。

  我们发现可以发现每条微博都在一个标签下。找到所有标签,我们就可以找到每条微博。然后根据你的需要,找到你需要的信息。

  这个文章是一个查找微博文字、用户和创建时间的例子。

  

  3.3 代码示例

  下面开始编写相关代码。首先是发送请求以获取相关的 HTML 文本。我们需要的是:

  下面是一个简单的例子

  import requestsfrom bs4 import BeautifulSoup# 请求的网址url = "https://s.weibo.com/weibo"# 请求头的文本,可以直接从网页中复制h = """Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9Accept-Encoding: gzip, deflate, brAccept-Language: zh,en-US;q=0.9,en;q=0.8,zh-CN;q=0.7Connection: keep-aliveCookie: XXXX(填自己的cookie)Host: s.weibo.comReferer: https://s.weibo.com/weibo/%25E7%258C%25AA%25E7%2598%259F?topnav=1&wvr=6&b=1Sec-Fetch-Dest: documentSec-Fetch-Mode: navigateSec-Fetch-Site: same-originSec-Fetch-User: ?1Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.106 Safari/537.36"""# 将复制得到的str处理成标准的字典格式def handle_header(s): dic = {} li = s.split('\n') for l in li: dic[l.split(': ')[0]] = l.split(': ')[1] return dic # 处理请求def handle(page, year, month, day, hour): #请求的参数,页面和时间等 load = { 'q': '郭涛道歉', 'typeall': '1', 'suball': '1', 'timescope': f'custom:{year}-{month}-{day}-{hour}:{year}-{month}-{day}-{hour + 1}', 'Refer': 'g', 'page': page } # 发送请求    j = requests.get(url, headers=handle_header(h), params=load, timeout=(10, 10)) return j.text

  这里可以通过handle函数获取html。然后通过beautifulsoup获取相关信息。相关代码如下

  # 转换成soup的对象soup = BeautifulSoup(handle(1, 2020, 05, 01, 00), 'lxml')# 使用find_all获取这页所有weibo的信息, {'class': 'card-wrap'} 定位微博内容信息contents = soup.find_all('div', {'class': 'card-wrap'})

  最后一步是从每条微博中提取有用信息

  def filter_info(content, _date, _mid): """ 过滤无效信息 :param content: :param _date: :param _mid: :return: """ # 这里传入的content是一个微博包含的所有信息,也就是一个 {'class': 'card-wrap'} 的定位信息 _content = content.find('div', {'class': 'content'}) # 获取用户名 nick_name = _content.find('p')['nick-name'] # 获取微博文本 blog = _content.find_all('p', {'class': 'txt'})[-1].text.replace('郭涛道歉', '郭涛道歉').strip().replace('\n', '\\n') # 获取时间 create = _content.find_all('p', {'class': 'from'})[-1].a.text.strip().replace('\n', '\\n') date_str = "".join(_date) data = {'mid': _mid, 'nick_name': nick_name, 'create': create, 'blog': blog, 'date_str': date_str} # 返回json格式的数据 return data

  至此,整个流程结束,filter_info返回的数据就是本页的微博信息。

  剩下的,只要结合上面的代码,添加你自己的逻辑,比如设置数据库和获取更多信息。

  完整参考代码请回复微博爬虫获取。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线