搜索指定网站内容(Pythonconsole翻页获取新内容、评论数和点赞数(图))

优采云 发布时间: 2021-12-13 06:10

  搜索指定网站内容(Pythonconsole翻页获取新内容、评论数和点赞数(图))

  ⑧点赞数

  由于图片无法直接在Python控制台中显示,我们决定抓取用户名、发布时间、发布工具、评论内容、转发数、评论数、点赞数。

  

  4.翻页获取新内容***

  决定获取内容后,并不是一切都会好起来的!因为我们不确定当前页面是否收录所有评论信息,所以我们先把页面滚轮拉到页面底部,然后一个loading...它不收录所有评论内容,我们需要不断滑动滚轮到页面底部以获取新的微博内容。终于,向下滚动了N多次,终于找到了最早的微博,发布于2010年10月8日。此时,即使滚轮滑到底部,微博也不会加载新页面。. 此时,我们所在的页面已经收录了#嘉兴南湖#话题下的所有内容!!!接下来,我将总结我们需要做的工作。

  

  

  总结需要做的工作

  1.需要模拟登录网页,可以通过selenium库中的webdriver方法构造驱动变量来实现。

  driver=webdriver.Firefox()

driver.get('https://m.weibo.cn/')

  2. 需要模拟鼠标点击微博首页搜索栏和#嘉兴南湖#话题下的实时按钮。这一步是通过调用 click() 方法来实现的。具体步骤为: ①使用selenium的find_elemens_by_xpath/id/css/class_name方法定位搜索栏和实时按钮的地址;②通过click()方法点击

  driver.find_element_by_class_name('m-search').click() #模拟鼠标点击微博首页搜索栏

driver.find_element_by_xpath('/html/body/div[1]/div[1]/div[1]/div[3]/div[2]/div[1]/div/div/div/ul/li[2]/span').click() #模拟鼠标点击实时按钮

  3.您需要模拟键盘输入并按回车键。这一步由 send_keys() 方法实现。输入文本的步骤是找到输入框的地址,然后send_keys("[text content]")模拟回车,key是send_keys(Keys.ENTER)。

  driver.find_element_by_xpath('/html/body/div/div[1]/div[1]/div[1]/div/div/div[2]/form/input').send_keys('#嘉兴南湖#') #找到输入框地址并输入#嘉兴南湖#

driver.find_element_by_xpath('/html/body/div/div[1]/div[1]/div[1]/div/div/div[2]/form/input').send_keys(Keys.ENTER) #模仿敲下回车键

  .您需要将滚轮滑动到页面底部。没什么好说的。直接执行代码,执行一次,滚轮会自动滑到页面底部。微博内容加载完毕后,再次执行,重复上述操作。driver.execute_script("window.scrollTo(0,document.body.scrollHeight);")

  5. 需要定位到每个微博内容的组成元素的地址:这里为了方便,我们使用xpath方法定位,这里有一个定位xPath-xPath Finder的神器,可以从火狐插件市场和扩展,使用该插件后,用鼠标点击网页的特定元素,该元素的xPath会自动显示在页面左下角,可以大大提高工作效率。

  

  

  定位到每个元素的xPath后,就可以分别获取并赋值给变量了。注意这里使用的是 find_elements_by_xpath 方法,而不是 find_element_by_xpath,

  因为作者发现find_element_by_xpath通常无法获取到正确的内容,因此获取的target是一个数据列表,需要添加一个[0].text来获取内容。

  ##获取第一篇微博中的各个元素信息##

headers=driver.find_elements_by_xpath('/html/body/div[1]/div[1]/div[1]/div[4]/div/div/div/header/div/div/a/h3')[0].text

date=driver.find_elements_by_xpath('/html/body/div[1]/div[1]/div[1]/div[4]/div/div/div/header/div/div/h4/span[1]')[0].text

phone=driver.find_elements_by_xpath('/html/body/div[1]/div[1]/div[1]/div[4]/div/div/div/header/div/div/h4/span[2]')[0].text

content=driver.find_elements_by_xpath('/html/body/div[1]/div[1]/div[1]/div[4]/div/div/div/article/div/div[1]')[0].text

zhuanfa=driver.find_elements_by_xpath('/html/body/div[1]/div[1]/div[1]/div[4]/div/div/div/footer/div[1]/h4')[0].text

pinglun=driver.find_elements_by_xpath('/html/body/div[1]/div[1]/div[1]/div[4]/div/div/div/footer/div[2]/h4')[0].text

dianzan=driver.find_elements_by_xpath('/html/body/div[1]/div[1]/div[1]/div[4]/div/div/div/footer/div[3]/h4')[0].text

  困难

  1.如何判断滑轮已转到页面底部?

  对于这个问题,作者的解决方案是比较翻页操作前微博内容对应的class_name或id_name的个数和翻页操作后的个数。如果后者的数量大于翻页操作后的数量。前者表示本次翻页有效。如果两者的数字仍然相等,则表示翻页已到页面的最低端,无需翻页。为了便于理解,算法规则如下图所示。在最终的实现代码中,我使用了每个微博内容对应的class_name“weibo-text”作为变量进行计算。

  

  2.如何设计爬取微博内容的循环结构

  我们观察到第一个微博内容的xpath是使用xPath_Finder点击第二个微博内容,xpath变成

  '/html/body/div[1]/div[1]/div[1]/div[5]/div/div/div/article/div/div[1]',

  那么可以认为决定微博内容顺序的标签在第四个div[]中,顺序以初始值4为基础,然后每条微博的值加1。然后在最后程序在实现中,只需要构造一个类似于for i in range(4,xxx): div[+str(i)+]的循环。对于范围的上限,正常思路是通过计算页面中每个微博对应的class_names的数量来确定总数,但是作者发现这个数字其实不太对,所以我的解决办法有点愚蠢:通过判断执行 错误数用于判断微博是否已被提取。如果提取完成后仍然执行driver.find_elements_by_xpath,程序会报错。每次报错,通过try except方法进行累计计算,累计错误次数为+1。设置一个小的阈值(比如5),当错误达到5次时,退出循环结束程序。这样初始上限就可以大胆设置为任意超大的数,比如1000000。

  项目代码实现

  完整程序及相关说明如下

<p>from selenium import webdriver

import time

import pandas as pd

from selenium.webdriver.common.keys import Keys

import selenium.webdriver.support.ui as ui

from selenium.webdriver.common.action_chains import ActionChains ##引入ActionChains鼠标操作类

def get_comments_from_weibo():

driver=webdriver.Firefox() #调用Firefox浏览器

#driver.set_headless() #无页面显示操作,为了方便观察程序运行状态,这个可以不加

driver.get(&#39;https://m.weibo.cn/&#39;) #访问微博页面

time.sleep(2) #设置一个休息时间,模拟人类正常的访问操作,也给页面留出足够的加载时间,下同

driver.find_element_by_class_name(&#39;m-search&#39;).click() #点击搜索栏

time.sleep(2)

driver.find_element_by_xpath(&#39;/html/body/div/div[1]/div[1]/div[1]/div/div/div[2]/form/input&#39;).send_keys(&#39;#嘉兴南湖#&#39;) #在输入框中输入#嘉兴南湖#

time.sleep(1)

driver.find_element_by_xpath(&#39;/html/body/div/div[1]/div[1]/div[1]/div/div/div[2]/form/input&#39;).send_keys(Keys.ENTER) #模仿回车键输入

time.sleep(3)

driver.find_element_by_xpath(&#39;/html/body/div[1]/div[1]/div[1]/div[3]/div[2]/div[1]/div/div/div/ul/li[2]/span&#39;).click() #点击实时按钮

time.sleep(3)

before_turning_number=0

global weibo_df

weibo_df=pd.DataFrame(columns=[&#39;headers&#39;,&#39;date&#39;,&#39;phone&#39;,&#39;content&#39;,&#39;zhuanfa&#39;,&#39;pinglun&#39;,&#39;dianzan&#39;]) #设置一个用户存储获取内容的df

after_turning_number=len(driver.find_elements_by_class_name(&#39;weibo-text&#39;))

row_number=0

error_number=0 #设置初始错误次数为0

##翻页到底程序段##

while after_turning_number>before_turning_number:

before_turning_number=after_turning_number

driver.execute_script("window.scrollTo(0,document.body.scrollHeight);") #执行下滑滑轮到底端操作

time.sleep(3) #执行翻页后的等待时间可以结合自身的网络情况适当延长

after_turning_number=len(driver.find_elements_by_class_name(&#39;weibo-text&#39;))

else:

print(&#39;翻页结束&#39;)

time.sleep(3)

##抽取用户信息、用户评论内容程序段##

for i in range(4,1000000):

if error_number

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线