爬取网页里表格数据放入列表

爬取网页里表格数据,感觉页面有些复杂,实在爬不出来

import time
import requests
from bs4 import BeautifulSoup
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
}#爬虫[Requests设置请求头Headers],伪造浏览器
# 核心爬取代码
url= 'https://www.basketball-reference.com/leagues/NBA_2014_games-december.html'
params = {"show_ram":1}
response = requests.get(url,params=params, headers=headers)#访问url
listData=[]#定义数组
soup = BeautifulSoup(response.text, 'html.parser')#获取网页源代码
tr = soup.find('tbody').find_all('tr')
#.find定位到所需数据位置  .find_all查找所有的tr(表格)
# 去除标签栏
for j in tr[1:]:        #tr2[1:]遍历第1列到最后一列,表头为第0列
    td = j.find_all('th')#td表格
    Date = td[0].get_text().strip()           
 #   Start(ET) = td[1].get_text().strip()  
#     Visitor/Neutral = td[2].get_text().strip()            
#     Visitor Points = td[3].get_text().strip()       
#     Home/Neutral = td[4].get_text().strip()                    
#     Home Points = td[5].get_text().strip()                   
#     &nbsp=td[6].get_text().strip() 
#     &nbspp=td[7].get_text().strip() 
#     Attend.=td[8].get_text().strip() 
#     Arena=td[9].get_text().strip() 
#     Notes=td[10].get_text().strip()
 

#     listData.append([Date,Start(ET),Visitor/Neutral,Visitor Points,Home/Neutral,Home Points,&nbsp,&nbspp,Attend.,Arena,Notes])
# print (listData)#打印
listData.append([Date])
print (listData)#

https://www.basketball-reference.com/leagues/NBA_2014_games-december.html

TechWhizKid参考GPT回答:

会爬取指定的网页,解析表格数据,并将结果打印出来。它将会获取比赛的日期和时间,访问队伍和它们的得分,主场队伍和它们的得分,比赛成绩链接的URL,加时赛,观众数量,以及比赛地点


import time
import requests
from bs4 import BeautifulSoup

headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
}#爬虫[Requests设置请求头Headers],伪造浏览器

url= 'https://www.basketball-reference.com/leagues/NBA_2014_games-december.html'
params = {"show_ram":1}
response = requests.get(url, params=params, headers=headers) #访问url

listData = [] #定义数组
soup = BeautifulSoup(response.text, 'html.parser') #获取网页源代码

tr = soup.find('tbody').find_all('tr') #.find定位到所需数据位置  .find_all查找所有的tr(表格)

for j in tr:
    th = j.find_all('th')  # 查找所有的th(表头)
    td = j.find_all('td')  # 查找所有的td(表格数据)
    
    if th and td:  # 确保每行都有数据
        Date = th[0].get_text().strip()  # 日期和时间
        Visitor_Team = td[0].get_text().strip()  # 访问队伍
        Visitor_Points = td[1].get_text().strip()  # 访问队伍的得分
        Home_Team = td[2].get_text().strip()  # 主场队伍
        Home_Points = td[3].get_text().strip()  # 主场队伍的得分
        Box_Score = 'https://www.basketball-reference.com' + td[4].a['href'] if td[4].a is not None else ''  # 比赛成绩链接URL
        Overtime = td[5].get_text().strip()  # 加时赛
        Attend = td[6].get_text().strip()  # 观众数量
        Arena = td[7].get_text().strip()  # 比赛地点

        listData.append([Date, Visitor_Team, Visitor_Points, Home_Team, Home_Points, Box_Score, Overtime, Attend, Arena])

# 输出结果
for data in listData:
    print(data)

你好,你可以尝试使用Python的BeautifulSoup库来爬取网页里的表格数据。在你的代码中,你已经使用了BeautifulSoup库来获取网页源代码并定位到所需数据位置。如果你遇到了困难,可以参考以下链接中的四种方法来爬取网页表格数据https://zhuanlan.zhihu.com/p/351603761。

此外,你的代码中有一些注释掉的行,这些行可能会导致语法错误。如果你想要将这些行解除注释,请确保它们是正确的,并且不会影响你的代码

回答部分参考、引用ChatGpt以便为您提供更准确的答案:

根据您提供的代码,您的目标是从指定网页中爬取表格数据并将其放入一个列表中。您使用了Requests库发送HTTP请求,并使用BeautifulSoup库解析网页源代码。

然而,根据您的描述,您遇到了困难,因为网页看起来比较复杂,您无法成功爬取表格数据。

在处理复杂的网页结构时,以下是一些建议和解决方法:

  1. 确定目标数据的位置:使用浏览器的开发者工具(通常按F12键打开)来查看网页的HTML结构,并确定表格数据所在的标签和层级关系。这将帮助您准确地定位到需要提取的数据。
  2. 使用合适的选择器:BeautifulSoup库提供了多种选择器(如find、find_all、select等)来定位HTML元素。根据目标数据的位置,选择合适的选择器来提取数据。
  3. 处理动态加载的内容:有些网页使用JavaScript动态加载数据,此时使用Requests库和BeautifulSoup库无法直接获取到完整的数据。您可以尝试使用Selenium库来模拟浏览器行为,并获取动态加载的内容。
  4. 处理反爬机制:一些网站采取了反爬机制,例如检测请求头中的User-Agent、设置访问频率限制等。您可以尝试修改请求头的User-Agent,或者使用代理IP来绕过反爬措施。

综上所述,处理复杂网页爬取问题需要具体针对网页结构进行分析和处理。由于我无法直接访问特定的网页,也无法查看网页的具体结构,因此无法给出针对您的情况的具体解决方法。

我建议您按照上述建议进行尝试,并根据具体情况进行调整。如果您遇到具体问题或错误信息,请提供更详细的描述,我将尽力提供帮助。

数据都在网页中,都是静态数据,比较好爬取,不用分析网络请求,我比较习惯用 xpath,所以就用 xpath 写的爬虫代码



import requests
from lxml import etree

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
}

start_url = 'https://www.basketball-reference.com/leagues/NBA_2014_games-december.html'
params = {"show_ram": 1}
response = requests.get(start_url, params=params, headers=headers).content.decode('utf-8')  # 访问url
html = etree.HTML(response)

# 获取表格的标题
titles = html.xpath('//table[@id="schedule"]/thead/tr/th/text()')
del titles[7]
del titles[6]

#获取整列的内容
date_game = html.xpath('//table[@id="schedule"]/tbody/tr/th/a/text()')
game_start_time = html.xpath('//table[@id="schedule"]/tbody/tr/td[1]/text()')
visitor_team_name = html.xpath('//table[@id="schedule"]/tbody/tr/td[2]/a/text()')
visitor_pts = html.xpath('//table[@id="schedule"]/tbody/tr/td[3]/text()')
home_team_name = html.xpath('//table[@id="schedule"]/tbody/tr/td[4]/a/text()')
home_pts = html.xpath('//table[@id="schedule"]/tbody/tr/td[5]/text()')
box_score_text = html.xpath('//table[@id="schedule"]/tbody/tr/td[6]/a/text()')
attendance = html.xpath('//table[@id="schedule"]/tbody/tr/td[8]/text()')
arena_name = html.xpath('//table[@id="schedule"]/tbody/tr/td[9]/text()')
game_remarks = html.xpath('//table[@id="schedule"]/tbody/tr/td[10]/text()')
if not len(game_remarks):
    game_remarks = [ '' for i in range(len(date_game)) ]

# print(date_game)
# print(game_start_time)
# print(visitor_team_name)
# print(visitor_pts)
# print(home_team_name)
# print(home_pts)
# print(box_score_text)
# print(attendance)
# print( arena_name )
# print( game_remarks )


listData = [titles]
for i in zip( date_game,game_start_time,visitor_team_name,visitor_pts,home_team_name,home_pts,box_score_text,attendance, arena_name,game_remarks):
    listData.append(list(i))

print(listData)



可以爬取出来打印到excel中,如下代码:


import time
import requests
from bs4 import BeautifulSoup
from openpyxl import Workbook


headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
}  # 爬虫[Requests设置请求头Headers],伪造浏览器
# 核心爬取代码
url = 'https://www.basketball-reference.com/leagues/NBA_2014_games-december.html'
params = {"show_ram": 1}
response = requests.get(url, params=params, headers=headers)  # 访问url
outwb = Workbook() #声明Workbook
outws = outwb.worksheets[0] # 定义excel 的sheet
soup = BeautifulSoup(response.text, 'html.parser')  # 获取网页源代码
tr = soup.find('tbody').find_all('tr')
# .find定位到所需数据位置  .find_all查找所有的tr(表格)
# 去除标签栏
outws.append(['Date','Start(ET)','Visitor/Neutral','PTS','Home/Neutral','PTS','','Attend.','Arena','Notes'])
for j in tr[1:]:  # tr2[1:]遍历第1列到最后一列,表头为第0列
    listData = []  # 定义数组
    th = j.find_all('th')  # th表格
    thDate = th[0].get_text().strip()
    listData.append(thDate)
    tds =  j.find_all('td') # td表格
    for k in tds[0:]:
        tdDate = k.get_text().strip()
        listData.append(tdDate)
    outws.append(listData)

outwb.save(r'test.xlsx')


因为上传不了excel附件,所以我就截图吧

img

  • 以下回答由chatgpt基于相关博客总结生成:

    我可以提供解决方案。 首先,需要使用爬虫库(比如requests、beautifulsoup等)爬取网页,获取表格数据。然后,使用数据处理库(比如pandas)将数据存入列表中。 以下是一个参考代码,使用requests和pandas库实现:

    import requests
    from bs4 import BeautifulSoup
    import pandas as pd
    
    # 发送请求,获取网页内容
    url = "https://www.basketball-reference.com/leagues/NBA_2014_games-december.html"
    r = requests.get(url)
    html_content = r.text
    
    # 解析网页内容,获取表格数据
    soup = BeautifulSoup(html_content, 'html.parser')
    table = soup.find('table')
    table_rows = table.tbody.find_all('tr')  # 获取表格行数据
    
    # 存储数据到列表中
    data = []
    for row in table_rows:
        cols = row.find_all('td')
        cols = [col.text.strip() for col in cols]
        data.append(cols)
    
    # 把数据存入pandas的dataframe中
    df = pd.DataFrame(data, columns=['date', 'away_team', 'away_pts', 'home_team', 'home_pts', 'overtime', 'attendance', 'notes'])
    

    注意,该代码仅适用于该仅有的网页,如果使用在其他网页上可能会出现问题,需要根据具体情况进行调整。

    另外,为了保证程序的稳定性,建议添加异常处理和反爬虫机制,以免被网站屏蔽。