aimer1111 2022-06-15 16:41 采纳率: 50%
浏览 53
已结题

selenium模拟登陆+爬取数据

from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
from lxml import etree
import requests
import time
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36'}

driver = webdriver.Chrome()
driver.get('https://www.timeshighereducation.com/')
sleep(5)

driver.find_element(By.XPATH,'//div[@class="col-sm-12"]/div[@class="navbar-button__wrapper"]/ul/li/a[@title="User account"]').click()
sleep(5)
driver.find_element(By.XPATH,'//div[@class="region region-secondary-navigation"]/section/div/ul/li/a[@id="modal-login"]').click()
sleep(5)

sleep(5)
driver.switch_to.frame(driver.find_element(By.XPATH,'//div[@id="modal-content"]/iframe'))

driver.find_element(ByXPATH,'//input[@placeholder="Username or email"]').send_keys("123456")
driver.find_element(By.XPATH,'//input[@placeholder="Password"]').send_keys("123456")
# driver.refresh()
driver.find_element(By.XPATH,'//form[@class="user-login-form"]/div/input[@value="Log in"]').click()
sleep(5)
driver.switch_to.parent_frame
sleep(5)

解析html字符串,获取需要的信息

def parse_html(html):
text = etree.HTML(html)

node_list = text.xpath('//tbody/tr[@class="odd row-1 js-row"]')
# print(node_list)
for i in node_list:
    try:
        # rank
        rank = i.xpath('/td[@class="rank sorting_1 sorting_2"]/text()')
        # name
        name = i.xpath('/td[@class=" name namesearch"]/a/text()')
        # region
        region = i.xpath('/td/div/div[@class="location"]/span/a/text()')
        #ratio
        # ratio = i.xpath('')
        # 构建json格式的字符串
        items = {
            "排名": rank,
            "名称": name,
            "地区/国家": region
        }
        print(items)
    except:
        pass

def main():
# 循环获取第0~15的网页源码,并解析
for page in range(0, 16):
# 每个网页的网址
url = 'https://www.timeshighereducation.com/world-university-rankings/2022#!/page/'+ str(page) + '/length/25/sort_by/rank/sort_order/asc/cols/stats'
# 爬取网页源码
html = requests.get(url, headers=headers).text
# 解析网页信息
parse_html(html)

程序运行入口

if name == 'main':
main()

为什么我爬不到数据,有没有能人赐教,本人初次接触

  • 写回答

2条回答 默认 最新

  • Katsu-S 2022-06-15 21:27
    关注
    1. if name == 'main':
    2. 输入用户名的地方少了个点
    3. parse_html中,node_list的xpath应该是[@id="datatable-1"]/tbody,你写的xpath是一行的xpath,所以解析会出错
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月30日
  • 已采纳回答 6月22日
  • 创建了问题 6月15日

悬赏问题

  • ¥15 微信小程序 用oss下载 aliyun-oss-sdk-6.18.0.min client报错
  • ¥15 ArcGIS批量裁剪
  • ¥15 labview程序设计
  • ¥15 为什么在配置Linux系统的时候执行脚本总是出现E: Failed to fetch http:L/cn.archive.ubuntu.com
  • ¥15 Cloudreve保存用户组存储空间大小时报错
  • ¥15 伪标签为什么不能作为弱监督语义分割的结果?
  • ¥15 编一个判断一个区间范围内的数字的个位数的立方和是否等于其本身的程序在输入第1组数据后卡住了(语言-c语言)
  • ¥15 Mac版Fiddler Everywhere4.0.1提示强制更新
  • ¥15 android 集成sentry上报时报错。
  • ¥15 抖音看过的视频,缓存在哪个文件