Advertisement

网页表格爬取方法

阅读量:

目录

介绍

步骤

观察网页内容:

方法一:直接使用pandas的.read_html方法读取表格:

方法二:使用request请求数据并解析:

总结:

介绍

假期进行一些爬虫的小练习,其中第一个设计到了网页表格的爬取。

用request请求得到数据之后直接xpath或者bs4进行解析就可以。

步骤

观察网页内容:

查看一下组成,发现数据在一个table里面,表格头就是thead,内容在tbody里面。

方法一:直接使用pandas的.read_html方法读取表格:

复制代码
 def pd_read_html(url):

    
     df=pd.read_html(io=url)
    
     print(df)

直接能够得到dataframe格式的数据,处理之后可以用

方法二:使用request请求数据并解析:

首先爬取表格头的内容:

打印thead里面的内容,发现有的在td,有的在td的子标签,是因为前端不同显示格式的要求,构造xpath路径的时候直接将td,还有子路径里面的内容都涉及到就好了。/text和//text分别表示td的内容还有td子标签的内容。

复制代码
 #爬取表格头:

    
     tr_list_title=tree.xpath('//*[@id="dataTable"]/thead/tr/td/text() | //*[@id="dataTable"]/thead/tr/td//text()')

再爬取表格的内容:

数据在tr标签里面存放,但是tr有id的仅是定位使用并没有数据存放。

自己用了一个比较笨的办法,直接使用range方法把自己需要的tr筛选出来。

复制代码
 #定位tr的函数

    
     def get_tr(x):
    
     # print('//*[@id="dataTable"]/tr[%s]' %x)
    
     text1=tree.xpath('//*[@id="dataTable"]/tr[%s]//text()' %x)
    
     text2=tree.xpath('//*[@id="dataTable"]/tr[%s]/text()' %x)
    
     text=[]
    
     text.append(text1)
    
     return(text)
    
     #使用range定位需要的tr标签
    
     for i in range(1,80,2):
    
     # tr_list_body.append(get_tr(i))
    
     text_pre=get_tr(i)
    
     print(text_pre)
    
     for i in text_pre:
    
         x=i[1:19:2]
    
         body_list.append(x)
    
     print(body_list)

筛选出来之后再使用列表的切片,把有用的数据筛选出来。

最后直接构造成为dataframe,保存即可。同时也可以在每次取到一条数据的时候直接写入文档,这个方法在后续会有展示。

总结

1、思路还有过程都很简单,主要是再熟悉一下request还有数据解析的基本流程

2、任务要求比较简单,如果需要翻页或者定位操作可以使用selenium或者构造url,后面的爬虫会 有展示。

代码:

复制代码
 import numpy as np

    
 from lxml import etree
    
 import requests
    
 import pandas as pd
    
  
    
 #方法一函数,直接利用pd.read_html
    
 def pd_read_html(url):
    
     df=pd.read_html(io=url)
    
     print(df)
    
  
    
 if __name__ == "__main__":
    
     url=''
    
     headers={
    
     'User-Agent':'*********************'
    
     }
    
     page_text=requests.get(url=url,headers=headers).text
    
  
    
     # 数据解析
    
     tree = etree.HTML(page_text)
    
     # print(page_text)
    
     #爬取表格头:
    
     tr_list_title=tree.xpath('//*[@id="dataTable"]/thead/tr/td/text() | //*[@id="dataTable"]/thead/tr/td//text()')
    
     #%%定义
    
     title_list=[]
    
     for i in tr_list_title:
    
     title_list.append(i)
    
     print(title_list)
    
  
    
     # 爬取每一行内容
    
     body_list=[]
    
     text_pre=[]
    
     #定位tr的函数
    
     def get_tr(x):
    
     # print('//*[@id="dataTable"]/tr[%s]' %x)
    
     text1=tree.xpath('//*[@id="dataTable"]/tr[%s]//text()' %x)
    
     text2=tree.xpath('//*[@id="dataTable"]/tr[%s]/text()' %x)
    
     text=[]
    
     text.append(text1)
    
     return(text)
    
     #使用range定位需要的tr标签
    
     for i in range(1,80,2):
    
     # tr_list_body.append(get_tr(i))
    
     text_pre=get_tr(i)
    
     # print(text_pre)
    
     for i in text_pre:
    
         x=i[1:19:2]
    
         body_list.append(x)
    
     print(body_list)
    
  
    
     list_all=[]
    
     for i in range(9):
    
     list1 = []
    
     for j in body_list:
    
         list1.append(j[i])
    
     list_all.append(list1)
    
     dict=dict(zip(title_list,list_all))
    
     print(dict)
    
     df=pd.DataFrame(dict)
    
     df.to_csv('text1.csv')
    
     print(df)

全部评论 (0)

还没有任何评论哟~