pandas爬取网页中含有表格的数据

有时候,我们需要对网页中的表格进行爬取,如果表格页数比较少,可以直接复制,但是如果有成百上千页的表格数据,就应该用Python快速的抓取下来。下面,我就来简单的介绍下如何利用pandas提取网页的表格信息。

分析思路

  • 获取网页的文本信息
  • 获取网页表格元素的具体定位

接下来,就是本文的重点了,直接先上代码。

#coding=utf-8

from lxml import etree
import requests
import csv
import pandas as pd
import multiprocessing

# 检查url地址
def check_link(url):
    try:
        headers = {
    
    
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36',
            #'Referer': 'http://598i.cloud/Login.php',
            'cookie': '你的cookie信息'
        }
        #proxies = {"http": "http://127.0.0.1:8080","https": "http://127.0.0.1:8080"}
        r =requests.get(url,headers = headers)
        r.raise_for_status()
        r.encoding = "utf-8"
        return r.text
    except:
        print('获取初始网页失败')



def get_contents(text,i):
    mytree = etree.HTML(text)  # 解析

    table = mytree.xpath('//table[@class="layui-table"]')
    table = etree.tostring(table[0], encoding='utf-8').decode()
    df = pd.read_html(table, encoding='utf-8', header=0)[0]
    results = list(df.T.to_dict().values())  # 转换成列表嵌套字典的格式
    df.to_csv(" result.csv",mode='a', encoding="utf_8",index=False)
    print("表格第{}页爬取结束".format(i))


def main():
    for i in range(101):
        url = "https://do?page={}".format(i)
        text = check_link(url)
        get_contents(text,i)

if __name__ == "__main__":
    main()

上面这份代码对于有表格的网页,复用率基本达到百分之百。

2021.10.22更新

再爬取表格的过程中,返回的结果可能会如下格式:

b’\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\xbd[ks\xd4F\x16\xfd\xbe\xbfb\xa2\xaa\xad\xe0\xda\x9e\x19I\xf3\xb4\xb1\xbd\xc5\x12\xb2\xa1j!\xd9\x84\xa4v7\x95r\xc93\x9a\x19\x81F\x9aH\x1a\x1b/a\x0b\x82\x01\x1b\x08\x8f\x04\x02\xc4\x06\xc2k\x81\x80\xc1\t\x8e\xcb\xc6

原因分析:

得到以上运行结果的原因是该网页使用了gzip压缩,这里我们只需要使用gzip解压即可。

解决办法如下:

req = urllib.request.Request(url=url, headers=headers)
response = urlopen(req)
content = response.read()
return gzip.decompress(content).decode('gbk')  #使用gzip来解压文件

参考文献

  • https://blog.csdn.net/weixin_53801131/article/details/117402579

Guess you like

Origin blog.csdn.net/weixin_35770067/article/details/119217745