赞
踩
今天我们来使用 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()
上面的代码中使用到了去重功能,在我们爬取的过程中,可能会爬取之前已经爬过的数据,此时我们就需要进行去重。我们使用最常见的 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)
输出如下:

注意:在使用 MD5 算法计算摘要之前,需要将字符串编码为二进制形式。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。