鱼C论坛

 找回密码
 立即注册
查看: 2014|回复: 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
我想爬取排名 学校 总分 类型 省市 层次 全爬下来
能不能写一下
我尝试了下 写不出来
  1. import requests
  2. from lxml import etree
  3. import openpyxl

  4. url = 'https://www.shanghairanking.cn/rankings/bcur/202011'
  5. 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'}
  6. r = requests.get(url, headers=headers)
  7. r.encoding = 'utf-8'
  8. html = etree.HTML(r.text)#利用etree.HTML,将字符串解析为HTML文档
  9. x = html.xpath('//*[@id="content-box"]/div[2]/table/tbody/tr/td[2]/a/text()')#//获取文档中所有匹配的节点
  10. d = html.xpath('//*[@id="content-box"]/div[2]/table/tbody/tr/td[3]/text()')
  11. l = html.xpath('//*[@id="content-box"]/div[2]/table/tbody/tr/td[4]/text()')
  12. z = html.xpath('//*[@id="content-box"]/div[2]/table/tbody/tr/td[5]/text()')
  13. c = html.xpath('//*[@id="content-box"]/div[2]/table/tbody/tr/td[6]/text()')
  14. wb = openpyxl.Workbook()
  15. ws = wb.active
  16. title = ['排名','学校','总分','类型','省','层次']
  17. print(title)
  18. ws.append(title)
  19. for i in range(len(x)):
  20.     lst=[i+1,x[i].strip(),z[i].strip(),l[i].strip(),d[i].strip(),c[i].strip()]
  21.     print(lst)
  22.     ws.append(lst)
  23.       
  24. wb.save('大学排名.xlsx')

复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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


  3. url = 'https://www.shanghairanking.cn/rankings/bcur/202011'
  4. 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'}
  5. r = requests.get(url, headers=headers)
  6. r.encoding = 'utf-8'
  7. html = etree.HTML(r.text)#利用etree.HTML,将字符串解析为HTML文档
  8. x = html.xpath('//*[@id="content-box"]/div[2]/table/tbody/tr/td[2]/a/text()')#//获取文档中所有匹配的节点
  9. d = html.xpath('//*[@id="content-box"]/div[2]/table/tbody/tr/td[3]/text()')
  10. for i in range(len(x)):
  11.         print(x[i],d[i][10:13])
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

加的代码什么意思,len(x), 10:13
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

爬取这个网页的完整代码能写下么
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


  3. url = 'https://www.shanghairanking.cn/rankings/bcur/202011'
  4. headers = {
  5.         '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'
  6. }

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

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

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

  26. #         university[num] = name
  27. # print(university)
复制代码

当前代码是直接打印
把16,32,33取消注释,再把30行注释,就可以把排名及学校名存入字典
小甲鱼最新课程 -> https://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] = '北京'
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

好的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

我想爬取排名 学校 总分 类型 省市 层次 全爬下来
能不能写一下
我尝试了下 写不出来
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  4. url = 'https://www.shanghairanking.cn/rankings/bcur/202011'
  5. 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'}
  6. r = requests.get(url, headers=headers)
  7. r.encoding = 'utf-8'
  8. html = etree.HTML(r.text)#利用etree.HTML,将字符串解析为HTML文档
  9. x = html.xpath('//*[@id="content-box"]/div[2]/table/tbody/tr/td[2]/a/text()')#//获取文档中所有匹配的节点
  10. d = html.xpath('//*[@id="content-box"]/div[2]/table/tbody/tr/td[3]/text()')
  11. l = html.xpath('//*[@id="content-box"]/div[2]/table/tbody/tr/td[4]/text()')
  12. z = html.xpath('//*[@id="content-box"]/div[2]/table/tbody/tr/td[5]/text()')
  13. c = html.xpath('//*[@id="content-box"]/div[2]/table/tbody/tr/td[6]/text()')
  14. wb = openpyxl.Workbook()
  15. ws = wb.active
  16. title = ['排名','学校','总分','类型','省','层次']
  17. print(title)
  18. ws.append(title)
  19. for i in range(len(x)):
  20.     lst=[i+1,x[i].strip(),z[i].strip(),l[i].strip(),d[i].strip(),c[i].strip()]
  21.     print(lst)
  22.     ws.append(lst)
  23.       
  24. wb.save('大学排名.xlsx')

复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-23 15:37:16 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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


  3. url = 'https://www.shanghairanking.cn/rankings/bcur/202011'
  4. headers = {
  5.         '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'
  6. }

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

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

  35.         print(num, name, city, type_, score, level)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

非常感谢 ,我之前用你那个代码改写的和你差不多,但是没有那个换行导致很多空格和逗号之类的东西,运行就会卡死 再次感谢哈
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

没事
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-30 05:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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