使用Selenium爬取动态网页为例-新浪微博网站解析

优采云 发布时间: 2021-07-24 02:01

  使用Selenium爬取动态网页为例-新浪微博网站解析

  今天我们将使用Selenium来抓取动态网页,以新浪微博网站为例。我们需要通过以下三个步骤进行抓取:

  登录新浪微博网站分析微博网站页面定期重新打开微博首页,抓取最新微博或拉动滚动条抓取更多以前的微博

  代码如下

  # -*- 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()

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

  下面以最常见的MD5摘要算法为例,计算一个字符串的MD5值。这里需要导入hashlib。 Hashlib 是一个 Python 标准库,提供了一些流行的哈希算法。有兴趣的朋友可以研究一下。

  def MD5_example():

str_md5 = hashlib.md5('life is short you need python'.encode('utf-8')).hexdigest()

print(str_md5)

  输出如下:

  

  注意:在使用MD5算法计算摘要之前,需要将字符串编码成二进制形式。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线