利用有界面游览器爬取人民网微博(火狐)

本文介绍了使用Selenium进行网页自动化测试的方法,包括安装配置、基本操作如打开网页、输入搜索词等,并通过实例展示了如何模拟登录操作及爬取特定页面内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本来今天应该写的是phantomjs+selenium实现无界面的爬取信息,但是对于这个phantomjs有点不入门,所以今天就简单的说一下selenium。

单单对于selenium来说,安装上没有说的,就用pip进行安装就行(pip install selenium)。安装好了之后我们就开始探索抓取的方法了。首先我们来运行一个小的程序:

from selenium import webdriver
browser = webdriver.Firefox()
browser.get('http://www.baidu.com/')
运行这三行代码就可以打开火狐游览器中的百度界面。如果你发现程序出错了,那就看一下有没有把游览器放到环境变量中.其实还可以下载一个小程序,就可以解决这个问题

链接:https://pan.baidu.com/s/1o8ywUq2 密码:to4h

下一步就是模拟提交,也就是在建的网页中进行提交,

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Firefox()
driver.get("http://www.python.org")
assert "Python" in driver.title
elem = driver.find_element_by_name("q")
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
print driver.page_source

上面的大部分懂了,然后就是对任务进行编辑:

首先我们要有一个逻辑,第一实现网页的创建和对人民网微博的登录;第二就是在登陆进去以后实现微博的翻页;第三步就是把每一个微博的评论找到实现微博和评论的爬取。

明白以后我们先看微博的登录:

#coding=UTF-8
import unittest
import time

import sys
reload(sys)
sys.setdefaultencoding('utf-8')
from selenium import webdriver
class PythonOrgSearch(unittest.TestCase):
#coding=UTF-8
import unittest
import time

import sys
reload(sys)
sys.setdefaultencoding('utf-8')
from selenium import webdriver
class PythonOrgSearch(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()
    def test_search_in_python_org(self):
        driver = self.driver

        driver.get("http://t.people.com.cn/indexV3.action")
        elem = driver.find_element_by_xpath('//*[@id="userName"]')
        elem.send_keys("18133592036")
        ggg = driver.find_element_by_xpath('//*[@id="password_text"]')
        ggg.send_keys("qwertyuiop")
        driver.find_element_by_xpath('/html/body/div[3]/div[2]/div[2]/div[2]/form/div[4]/input').click()
        driver.find_element_by_xpath('/ html / body / div[2] / div / div[3] / a[2]').click()
        driver.find_element_by_xpath('/html/body/div[2]/div/a').click()

        for p in range(1,4):
            print '第' + str(p) + '页'
            for k in range(1, 4):
                driver.maximize_window()
                driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")
                time.sleep(1)
            for m in range(1, 95):
                for k in driver.find_elements_by_xpath('/html/body/div[1]/div[2]/div/div[1]/div[4]/div[' + str(m) + ']/div[2]/div[4]/div[2]/a[3]'):
                    k.click()
                    time.sleep(0.1)
                    # print m
            a = driver.find_elements_by_class_name('list_item')
            l = []
            for i in a:
                if i not in l:
                    l.append(i)
            for m in l:
                print m.text
            driver.find_element_by_class_name('wbp_pagelist_nextbtn').click()


def setUp(self): self.driver = webdriver.Firefox() def test_search_in_python_org(self): driver = self.driver driver.get("http://t.people.com.cn/indexV3.action") elem = driver.find_element_by_xpath('//*[@id="userName"]') elem.send_keys("账号") ggg = driver.find_element_by_xpath('//*[@id="password_text"]') ggg.send_keys("密码") driver.find_element_by_xpath('/html/body/div[3]/div[2]/div[2]/div[2]/form/div[4]/input').click() driver.find_element_by_xpath('/ html / body / div[2] / div / div[3] / a[2]').click() driver.find_element_by_xpath('/html/body/div[2]/div/a').click()


在最下面的三行中,实现的是自动点击继续。

我们再来看实现翻页和评论的爬取。

在实现这两个的要求的时候,我是先把评论都点了一下,在去实现整个网页的爬取,可是这种操作不是很好。因为在实现吧整个页面都点击一下的时候,当有一个人发的微博是转发的别人的微博,这个功能就会点击被转发人的主页,有了跳转的页面的情况,于是就有了下面的这种方法:

#coding=UTF-8
import unittest
import time

import sys
reload(sys)
sys.setdefaultencoding('utf-8')
from selenium import webdriver
class PythonOrgSearch(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()
    def test_search_in_python_org(self):
        driver = self.driver

        driver.get("http://t.people.com.cn/indexV3.action")
        elem = driver.find_element_by_xpath('//*[@id="userName"]')
        elem.send_keys("账号")
        ggg = driver.find_element_by_xpath('//*[@id="password_text"]')
        ggg.send_keys("密码")
        driver.find_element_by_xpath('/html/body/div[3]/div[2]/div[2]/div[2]/form/div[4]/input').click()
        driver.find_element_by_xpath('/ html / body / div[2] / div / div[3] / a[2]').click()
        driver.find_element_by_xpath('/html/body/div[2]/div/a').click()

        for p in range(1,4):
            print '第' + str(p) + '页'
            for k in range(1, 4):
                driver.maximize_window()
                driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")
                time.sleep(1)
            for m in range(1, 95):
                for k in driver.find_elements_by_xpath('/html/body/div[1]/div[2]/div/div[1]/div[4]/div[' + str(m) + ']/div[2]/div[4]/div[2]/a[3]'):
                    k.click()
                    time.sleep(0.1)
                    # print m
            a = driver.find_elements_by_class_name('list_item')
            l = []
            for i in a:
                if i not in l:
                    l.append(i)
            for m in l:
                print m.text
            driver.find_element_by_class_name('wbp_pagelist_nextbtn').click()

以上就是这次的程序。



### 使用Python爬虫抓取特定微博用户的微博内容 为了有效地抓取特定微博用户发布的微博内容,可以采用以下方法: 1. **分析目标页面结构** 需要先了解微博网站的具体架构以及数据传输方式。通常情况下,微博的数据会通过Ajax请求动态加载[^2]。 2. **模拟登录并保持Session** 微博对于未登录状态下的API调用有严格限制,因此建议使用Selenium或其他工具来模拟浏览器行为完成自动登录过程,并保存相应的Cookies用于后续HTTP请求头中携带验证信息。 3. **构建合理的请求参数** 根据观察得知,当浏览某位博主主页时,实际发送给服务器端的GET/POST请求包含了多个重要字段,比如`containerid`, `page`, 等等。这些参数决定了最终返回的内容范围和分页情况。可以通过Fiddler或Chrome开发者工具中的Network面板查看具体的网络流量详情。 4. **处理反爬措施** 考虑到微博官方对频繁访问存在一定的防护策略,如IP封禁、验证码校验等,所以在编写脚本过程中应当加入适当的延时操作以降低触发频率;同时也可以考虑利用代理池轮询更换出口地址规避单一IP被识别的风险[^1]。 5. **解析响应JSON对象** 成功接收到包含所需微博列表项在内的json格式字符串之后,就可以运用正则表达式或者第三方库(BeautifulSoup, lxml)提取感兴趣的部分了。注意部分敏感字符可能经过编码转换需做相应解码处理。 下面给出一段简单的代码片段作为参考: ```python import requests from urllib.parse import urlencode def get_weibo(uid='your_target_uid', page=1): base_url = 'https://m.weibo.cn/api/container/getIndex?' headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)", "Cookie": "_T_WM=xxxxxx;" # 替换成自己的cookie } params = { 'type': 'uid', 'value': uid, 'containerid': f'107603{uid}', # 这里是固定的模式 'page': str(page), } url = base_url + urlencode(params) response = requests.get(url=url, headers=headers) if response.status_code == 200: return response.json() else: raise Exception('Failed to fetch data') if __name__ == '__main__': result = get_weibo() print(result) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值