当前位置:   article > 正文

爬取新浪微博网站_1、 打开新浪微博网站首页,爬取微博发布者、发布者个人主页url和发布的微博内容。

1、 打开新浪微博网站首页,爬取微博发布者、发布者个人主页url和发布的微博内容。

今天我们来使用 Selenium 爬取动态网页,以新浪微博网站为例。我们需要分以下三步进行爬取:

  1. 登录新浪微博网站
  2. 解析微博网站页面
  3. 定时重新打开微博首页,爬取最新发布的微博或者拉动滚动条爬取更多以前的微博

代码如下

# -*- coding: utf-8 -*-
# # @Author: lemon
# # @Date:   2019-09-24 16:20
# # @Last Modified by:   lemon
# # @Last Modified time: 2019-09-24 19:12
# # @function: 爬取新浪微博网站

from selenium import webdriver
import time
import pandas as pd
import hashlib          # 摘要算法(哈希算法)包

# 创建 data 用来存储
def  create_frame():
    data = {
        '用户_id': [],
        '用户_url': [],
        '微博内容': []
    }

    return data

# 写入data
def data_writer(pub_id, pub_url, pub_content):
    data['用户_id'].append(pub_id)
    data['用户_url'].append(pub_url)
    data['微博内容'].append(pub_content)

# 保存文件
def data_save():
    frame = pd.DataFrame(data)
    frame.to_excel('微博用户数据.xlsx')


# 登录微博
def login():
    driver.get('https://weibo.com')
    time.sleep(5)
    driver.set_window_size(1920, 1080)      # 设置浏览器大小
    username = driver.find_element_by_xpath('//*[@id="loginname"]')             # 用户名输入框
    username.send_keys('lemon_of_sun@sina.com')                                 # 发送账号
    password = driver.find_element_by_xpath('//*[@id="pl_login_form"]/div/div[3]/div[2]/div/input')     # 密码输入框
    password.send_keys('sunxusen2020')          # 发送密码
    submit = driver.find_element_by_xpath('//*[@id="pl_login_form"]/div/div[3]/div[6]')     # 登录按钮
    print('准备登录...')
    submit.click()          # 点击登录按钮
    time.sleep(4)           # 停止 4s , 确保已成功切入后续页面

# 抓取页面
def spider():
    driver.get('https://www.weibo.com')         # 刷新微博网站首页
    print('已登录...')

    # 先获取页面中所有微博代码段, 然后使用循环从每一段中提取数据
    all_weibo = driver.find_elements_by_xpath('//*[@class="WB_feed_detail clearfix"]')
    for weibo in all_weibo:
        pub_id = weibo.find_elements_by_xpath('div[3]/div[1]/a[1]')[0].text     # 解析出微博用户 id
        pub_url = weibo.find_elements_by_xpath('div[3]/div[1]/a[1]')[0].get_attribute('href')       # 解析出发布者 URL
        try:
            pub_content = weibo.find_elements_by_xpath('div[3]/div[4]')[0].text
        except:
            print(f'{pub_id} : 无内容')
            pub_content = '无内容'
            pass

        hash_content = hashlib.md5(pub_content.encode('utf-8')).hexdigest()     # 计算微博内容的 MD5 值
        if hash_content not in is_dup:
            print(f'成功抓取 : {pub_id}')
            data_writer(pub_id, pub_url, pub_content)
            is_dup.add(hash_content)


if __name__ == '__main__':
    is_dup = set()              # 创建一个空的 set, 用来去重
    data = create_frame()
    driver = webdriver.Chrome('E:\ChromeDriver\chromedriver.exe')
    login()
    for i in range(3):
        spider()
        time.sleep(10)
    data_save()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81

上面的代码中使用到了去重功能,在我们爬取的过程中,可能会爬取之前已经爬过的数据,此时我们就需要进行去重。我们使用最常见的 set 数据结构进行去重。我们使用微博内容进行去重判断,可以将爬取到的内容直接加到 set 中,但是由于微博内容一般比较多,直接使用会占用较大的内存,影响爬虫效率。下面我们采用摘要算法(又称哈希算法),它通过一个函数把任意长度的数据转换为一个长度固定的数据串。微博内容是一个很长的字符串,使用摘要算法会得到一个固定长度的摘要,如果一段时间后再次爬取到了这条微博,对它使用摘要算法会得到相同的摘要;如果再次爬取的微博内容有变化,计算出的摘要会不同于原始微博的摘要。

下面以最常见的 MD5 摘要算法为例,计算出一个字符串的 MD5 值。这里需要导入 hashlib 。hashlib 是一个提供了一些流行的 hash 算法的 Python 标准库,感兴趣的小伙伴可以研究一下。

def MD5_example():
    str_md5 = hashlib.md5('life is short you need python'.encode('utf-8')).hexdigest()
    print(str_md5)
  • 1
  • 2
  • 3

输出如下:
在这里插入图片描述
注意:在使用 MD5 算法计算摘要之前,需要将字符串编码为二进制形式。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/57047
推荐阅读
相关标签
  

闽ICP备14008679号