有时候,我们需要对网页中的表格进行爬取,如果表格页数比较少,可以直接复制,但是如果有成百上千页的表格数据,就应该用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