通过selenium爬取新浪微博

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.action_chains import ActionChains
import csv
import PIL.Image as image
from PIL import Image, ImageEnhance
import time, re, random
import requests
from io import StringIO

# 保存信息
def towrite(item):
    with open('weibo.csv', 'a', encoding='utf-8') as csvfile:
        writer = csv.writer(csvfile)
        try:
            writer.writerow(item)
        except:
            print("writer error!")

# # 对比RGB值
# def is_similar(image1, image2):
#     # 获取指定位置的RGB值
#     pixel1 = image1.getpixel((x,y))
#     pixel2 = image2.getpixel((x,y))
#     for i in range(0,3):
#         # 如果相差超过50则认为找到缺口位置
#         if abs(pixel1[i]-pixel2[i]) >= 50:
#             return False
#     return True
#
# # 计算缺口位置
# def get_diff_location(image1, image2):
#     i = 0
#     # 两张原始图的大小都是相同的260*160
#     # 通过两个for循环依次对比RGB值
#     # 如果相差50则认为找到了缺口的位置
#     for i in range(62, 260):
#         for j in range(0, 160):
#             if is_similar(image1, image2, i, j) == False:
#                 return i

# 主函数
def main():
    # 登录微博
    login_url = "https://passport.weibo.cn/signin/login?entry=mweibo&res=wel&wm=3349&r=http%3A%2F%2Fm.weibo.cn%2F"
    driver = webdriver.Chrome()
    driver.get(login_url)
    driver.implicitly_wait(60)  # 最多等待60s
    time.sleep(5)
    username = driver.find_element_by_xpath('//*[@id="loginName"]')
    username.send_keys('')  # 填入账号
    password = driver.find_element_by_xpath('//*[@id="loginPassword"]')
    password.send_keys('') # 填入账号密码
    time.sleep(5)
    submit = driver.find_element_by_xpath('//*[@id="loginAction"]')
    submit.click()  # 点击登录
    time.sleep(2)

    # 点击验证码
    try:
        yanzheng = driver.find_element_by_xpath('//*[@id="embed-captcha"]/div/div[2]/div[1]/div[3]')
        yanzheng.click()
    except Exception as err:
        print(err)

    time.sleep(5)

    # # 滑动验证码
    # driver.get_screenshot_as_file("D:/滑动验证.jpg") # 对整个页面截图
    # imgelement = driver.find_element_by_xpath('/html/body/div[4]/div[2]/div[1]/div/div[1]/div[1]/div/a/div[1]/div/canvas[1]') # 定位验证码
    # location = imgelement.location # 获取验证码x,y轴坐标
    # size = imgelement.size # 获取验证码的长宽
    # rangle = (int(location['x']), int(location['y']), int(location['x'] + size['width']), int(location['y'] + size['height'])) # 需要截取的位置坐标
    # i = Image.open("D:/滑动验证.jpg") # 打开截图
    # i = i.convert('RGB')
    # frame1 = i.crop(rangle) # 使用Image的crop函数, 从截图中再次截取我们需要的区域
    # frame1.save('D:/滑动验证new.jpg')
    # driver.find_element_by_xpath('/html/body/div[4]/div[2]/div[1]/div/div[1]/div[2]/div[2]').click()
    # time.sleep(3)
    #
    # driver.get_screenshot_as_file("D:/滑动验证.jpg")
    # imgelement = driver.find_element_by_xpath('/html/body/div[4]/div[2]/div[1]/div/div[1]/div[1]/div/a/div[1]/div/canvas[2]')
    # location = imgelement.location  # 获取验证码x,y轴坐标
    # size = imgelement.size  # 获取验证码的长宽
    # rangle = (int(location['x']), int(location['y']), int(location['x'] + size['width']),
    #           int(location['y'] + size['height']))  # 需要截取的位置坐标
    # i = Image.open("D:/滑动验证.jpg")  # 打开截图
    # i = i.convert('RGB')
    # frame2 = i.crop(rangle)  # 使用Image的crop函数, 从截图中再次截取我们需要的区域
    # frame2.save('D:/滑动验证new2.jpg')
    #
    # # 计算缺口位置
    # loc = get_diff_location(frame1, frame2)
    # print('-------------')
    # print(loc)
    # # 找到滑动的圆球
    # element = driver.find_element_by_xpath('/html/body/div[4]/div[2]/div[1]/div/div[1]/div[2]/div[2]')
    # location = element.location
    # # 获取滑动圆球的高度
    # y = location['y']
    # # 鼠标点击元素并按住不放
    # print("点击按钮不放")
    # ActionChains(driver).click_and_hold(on_element=element).perform()
    # time.sleep(0.15)
    # # 拖动
    # print("拖动按钮")
    # ActionChains(driver).move_to_element_with_offset(to_element=element, xoffset=loc + 30, yoffset=loc - 445).perform()
    # # 释放鼠标
    # ActionChains(driver).release(on_element=element).perform()

    # 爬取文章信息并保存
    try:
        all_weibo = driver.find_elements_by_xpath('//*[@id="app"]/div[1]/div[2]/div[2]')
        print("all_weibo:", all_weibo)
        for weibo in all_weibo:
            fabuId = weibo.find_elements_by_xpath('div/div/div/header/div[2]/div/a/h3/text()')[0].text
            fabuNeirong = weibo.find_elements_by_xpath('div/div/article/div/div/div[1]')[0].text
            item = [fabuId, fabuNeirong]
            towrite(item)
    except:
        print("爬取失败!")

# 主函数入口
if __name__ == '__main__':
    main()
支持自定义搜素关键字、搜索起始时间、爬取起始页数(以实现中断后接上次继续爬取)。爬取内容包括微博账号、发文时间、发送平台、微博内容、转发次数、评论次数、点赞次数、原博地址。 爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求网页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫对获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值