鱼C论坛

 找回密码
 立即注册
查看: 1591|回复: 12

[已解决]爬取一个页面的信息

[复制链接]
发表于 2020-12-22 13:32:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我想要爬取这个页面的信息https://www.shanghairanking.cn/rankings/bcur/202011
我自己写了点 ,但不太懂
import requests
from lxml import etree


url = 'https://www.shanghairanking.cn/rankings/bcur/202011'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36'}
r = requests.get(url, headers=headers)
r.encoding = 'utf-8'
html = etree.HTML(r.text)#利用etree.HTML,将字符串解析为HTML文档
x = html.xpath('//*[@id="content-box"]/div[2]/table/tbody/tr/td[2]/a/text()')#//获取文档中所有匹配的节点
d = html.xpath('//*[@id="content-box"]/div[2]/table/tbody/tr/td[3]/text()')
print(x)
print(d)
怎么让他排版和网页一样 怎么会有很多的逗号 /n 之类的东西
求求解答 感激!
最佳答案
2020-12-23 15:28:18
私はり 发表于 2020-12-23 14:27
我想爬取排名 学校 总分 类型 省市 层次 全爬下来
能不能写一下
我尝试了下 写不出来
import requests
from lxml import etree
import openpyxl

url = 'https://www.shanghairanking.cn/rankings/bcur/202011'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36'}
r = requests.get(url, headers=headers)
r.encoding = 'utf-8'
html = etree.HTML(r.text)#利用etree.HTML,将字符串解析为HTML文档
x = html.xpath('//*[@id="content-box"]/div[2]/table/tbody/tr/td[2]/a/text()')#//获取文档中所有匹配的节点
d = html.xpath('//*[@id="content-box"]/div[2]/table/tbody/tr/td[3]/text()')
l = html.xpath('//*[@id="content-box"]/div[2]/table/tbody/tr/td[4]/text()')
z = html.xpath('//*[@id="content-box"]/div[2]/table/tbody/tr/td[5]/text()')
c = html.xpath('//*[@id="content-box"]/div[2]/table/tbody/tr/td[6]/text()')
wb = openpyxl.Workbook()
ws = wb.active
title = ['排名','学校','总分','类型','省','层次']
print(title)
ws.append(title)
for i in range(len(x)):
    lst=[i+1,x[i].strip(),z[i].strip(),l[i].strip(),d[i].strip(),c[i].strip()]
    print(lst)
    ws.append(lst)
       
wb.save('大学排名.xlsx')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-22 15:58:56 | 显示全部楼层
import requests
from lxml import etree


url = 'https://www.shanghairanking.cn/rankings/bcur/202011'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36'}
r = requests.get(url, headers=headers)
r.encoding = 'utf-8'
html = etree.HTML(r.text)#利用etree.HTML,将字符串解析为HTML文档
x = html.xpath('//*[@id="content-box"]/div[2]/table/tbody/tr/td[2]/a/text()')#//获取文档中所有匹配的节点
d = html.xpath('//*[@id="content-box"]/div[2]/table/tbody/tr/td[3]/text()')
for i in range(len(x)):
        print(x[i],d[i][10:13])
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-22 18:30:23 | 显示全部楼层

加的代码什么意思,len(x), 10:13
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-22 18:31:54 | 显示全部楼层

爬取这个网页的完整代码能写下么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-22 20:56:04 | 显示全部楼层
import requests
from lxml import etree


url = 'https://www.shanghairanking.cn/rankings/bcur/202011'
headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36'
}

# 获取网页源代码
res = requests.get(url=url, headers=headers)
res.encoding = 'utf-8'
html = etree.HTML(res.text)#利用etree.HTML,将字符串解析为HTML文档

# 建立字典,存放排名与学校名
# university = {}

# 用xpath解析html文档,//表示当前节点的子节点或孙子节点,/表示当前节点的直接子节点,@表示属性,text()表示html文档标签的内容
# 取出排名
num_data_list = html.xpath('//div[@class="rk-table-box"]//tbody/tr/td[1]/text()')
len_num_data = len(num_data_list)
# 取出学校名
name_list = html.xpath('//div[@class="rk-table-box"]//tbody/tr/td[2]/a/text()')
# 用索引值遍历排名
for i in range(len_num_data):
        # 处理排名格式,先用换行符切片,排名在切片后的第二个元素,再用lstrip()去除数字前面的空格
        num = num_data_list[i].split('\n')[1].lstrip()
        # 因为排名和学校名一一对应,所以可以用索引值来对应他们
        name = name_list[i]
        print(num, name)

#         university[num] = name
# print(university)
当前代码是直接打印
把16,32,33取消注释,再把30行注释,就可以把排名及学校名存入字典
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-23 08:20:57 | 显示全部楼层
私はり 发表于 2020-12-22 18:31
爬取这个网页的完整代码能写下么

你写的代码里,html就是整个网页了

x和d都是从html中,根据xpath相同所截取的不同列表

len(x)代表的列表中有多少个元素

d[i][10:13]标识d列表第i个元素中的第10~13个字符串

比如
d[i] = '\n          北京\n          '
d[i][10:13] = ' 北京'
d[i][11:13] = '北京'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-23 14:21:16 | 显示全部楼层
逃兵 发表于 2020-12-23 08:20
你写的代码里,html就是整个网页了

x和d都是从html中,根据xpath相同所截取的不同列表

好的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-23 14:27:47 | 显示全部楼层
太阳总会升起 发表于 2020-12-22 20:56
当前代码是直接打印
把16,32,33取消注释,再把30行注释,就可以把排名及学校名存入字典

我想爬取排名 学校 总分 类型 省市 层次 全爬下来
能不能写一下
我尝试了下 写不出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-23 15:28:18 | 显示全部楼层    本楼为最佳答案   
私はり 发表于 2020-12-23 14:27
我想爬取排名 学校 总分 类型 省市 层次 全爬下来
能不能写一下
我尝试了下 写不出来
import requests
from lxml import etree
import openpyxl

url = 'https://www.shanghairanking.cn/rankings/bcur/202011'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36'}
r = requests.get(url, headers=headers)
r.encoding = 'utf-8'
html = etree.HTML(r.text)#利用etree.HTML,将字符串解析为HTML文档
x = html.xpath('//*[@id="content-box"]/div[2]/table/tbody/tr/td[2]/a/text()')#//获取文档中所有匹配的节点
d = html.xpath('//*[@id="content-box"]/div[2]/table/tbody/tr/td[3]/text()')
l = html.xpath('//*[@id="content-box"]/div[2]/table/tbody/tr/td[4]/text()')
z = html.xpath('//*[@id="content-box"]/div[2]/table/tbody/tr/td[5]/text()')
c = html.xpath('//*[@id="content-box"]/div[2]/table/tbody/tr/td[6]/text()')
wb = openpyxl.Workbook()
ws = wb.active
title = ['排名','学校','总分','类型','省','层次']
print(title)
ws.append(title)
for i in range(len(x)):
    lst=[i+1,x[i].strip(),z[i].strip(),l[i].strip(),d[i].strip(),c[i].strip()]
    print(lst)
    ws.append(lst)
       
wb.save('大学排名.xlsx')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-23 15:37:16 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-23 15:56:56 | 显示全部楼层
私はり 发表于 2020-12-23 14:27
我想爬取排名 学校 总分 类型 省市 层次 全爬下来
能不能写一下
我尝试了下 写不出来

还是和取出排名的一样,处理方法也一样,你可以把相同的写一个函数来调用
import requests
from lxml import etree


url = 'https://www.shanghairanking.cn/rankings/bcur/202011'
headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36'
}

# 获取网页源代码
res = requests.get(url=url, headers=headers)
res.encoding = 'utf-8'
html = etree.HTML(res.text)#利用etree.HTML,将字符串解析为HTML文档

# 用xpath解析html文档,//表示当前节点的子节点或孙子节点,/表示当前节点的直接子节点,@表示属性,text()表示html文档标签的内容
# 取出排名
num_data_list = html.xpath('//div[@class="rk-table-box"]//tbody/tr/td[1]/text()')
len_num_data = len(num_data_list)
# 取出学校名
name_list = html.xpath('//div[@class="rk-table-box"]//tbody/tr/td[2]/a/text()')
# 取出省市
city_list = html.xpath('//div[@class="rk-table-box"]//tbody/tr/td[3]/text()')
# 取出类型
type_list = html.xpath('//div[@class="rk-table-box"]//tbody/tr/td[4]/text()')
# 取出总分
score_list = html.xpath('//div[@class="rk-table-box"]//tbody/tr/td[5]/text()')
# 取出层次
level_list = html.xpath('//div[@class="rk-table-box"]//tbody/tr/td[6]/text()')
# 用索引值遍历排名
for i in range(len_num_data):
        # 处理排名格式,先用换行符切片,排名在切片后的第二个元素,再用lstrip()去除数字前面的空格
        num = num_data_list[i].split('\n')[1].lstrip()
        # 因为排名和学校名一一对应,所以可以用索引值来对应他们
        name = name_list[i]
        city = city_list[i].split('\n')[1].lstrip()
        type_ = type_list[i].split('\n')[1].lstrip()
        score = score_list[i].split('\n')[1].lstrip()
        level = level_list[i].split('\n')[1].lstrip()

        print(num, name, city, type_, score, level)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-23 16:05:07 | 显示全部楼层
太阳总会升起 发表于 2020-12-23 15:56
还是和取出排名的一样,处理方法也一样,你可以把相同的写一个函数来调用

非常感谢 ,我之前用你那个代码改写的和你差不多,但是没有那个换行导致很多空格和逗号之类的东西,运行就会卡死 再次感谢哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-23 16:09:27 | 显示全部楼层
私はり 发表于 2020-12-23 16:05
非常感谢 ,我之前用你那个代码改写的和你差不多,但是没有那个换行导致很多空格和逗号之类的东西,运行 ...

没事
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-17 01:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表