抓取网页数据违法吗(2019北京500强企业名单_排行榜123网中国企业500)

优采云 发布时间: 2022-03-20 07:05

  抓取网页数据违法吗(2019北京500强企业名单_排行榜123网中国企业500)

  如果你的爬虫需要爬取的内容存在于页面的table标签中,那么本文探讨的方法对你很有帮助。

  以下两个网址有非常规范的表格数据

  北京有哪​​些世界500强企业? 2019北京500强企业榜_排名123网络​

  

  中国企业500强_百度百科​

  

  前者是北京500强企业名单,后者是中国500强企业名单

  

  对于常规爬取,需要对页面进行分析,准确找到这部分内容的标签位置,然后进行定点爬取。分析了好几页,发现这些表的数据非常相似

  它们存储在table标签中,第一个tr是第一行的标题,第二个tr是数据内容

  

排名

公司名称(中英文)

营业收入(百万美元)

2

国家电网公司(STATE GRID)

348903.1

3

中国石油化工集团公司(SINOPEC GROUP)

326953

4

中国石油天然气集团公司(CHINA NATIONAL PETROLEUM)

326007.6

  既然都长得一样,不如写一个通用的表单抓取函数,这样当你再次遇到这种类型的页面时,可以快速抓取,为什么不写一个通用的表单抓取爬虫,因为获取的页面不同方式不同,但是只要获取到了html,剩下的解析提取过程都是一样的。

  如果你想让一个函数处理所有情况,你需要对表格有特殊的了解,这样这个函数才能覆盖大部分情况。至于少数特殊页面,不在此功能范围内。

  第一个 tr 是标题行,它的内部标签可以是 th 或 td。对于tbody中的tr,其内部都是td,写程序时要注意。获取 td 内容时,只关心实际的文本内容,不想要粗体标签或链接。因此,代码中只需要提取td下的文本内容即可。

  思路定了,代码好写

  import pprint

import requests

from lxml import etree

def get_table_from_html(html):

tree = etree.HTML(html)

# 寻找所有的table标签

table_lst = tree.xpath("//table")

table_data_lst = []

for table in table_lst:

table_data_lst.append(get_table(table))

return table_data_lst

def get_table(table_ele):

"""

获取table数据

:param table_ele:

:return:

"""

tr_lst = table_ele.xpath(".//tr")

# 第一行通常来说都是标题

title_data = get_title(tr_lst[0])

# 第一行后面都是数据

data = get_data(tr_lst[1:])

return {

'title': title_data,

'data': data

}

def get_title(tr_ele):

"""

获取标题

标题可能用th 标签,也可能用td标签

:param tr_ele:

:return:

"""

# 先寻找th标签

title_lst = get_tr_data_by_tag(tr_ele, 'th')

if not title_lst:

title_lst = get_tr_data_by_tag(tr_ele, 'td')

return title_lst

def get_data(tr_lst):

"""

获取数据

:param tr_lst:

:return:

"""

datas = []

for tr in tr_lst:

tr_data = get_tr_data_by_tag(tr, 'td')

datas.append(tr_data)

return datas

def get_tr_data_by_tag(tr, tag):

"""

获取一行数据

:param tr:

:param tag:

:return:

"""

datas = []

nodes = tr.xpath(".//{tag}".format(tag=tag))

for node in nodes:

text = node.xpath('string(.)').strip()

datas.append(text)

return datas

def get_html(url):

headers = {

'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36',

}

res = requests.get(url, headers=headers)

res.encoding = 'utf-8'

return res.text

def run():

url = 'https://baike.baidu.com/item/%E4%B8%AD%E5%9B%BD%E4%BC%81%E4%B8%9A500%E5%BC%BA/5542706?fr=aladdin'

# url = "https://www.phb123.com/qiye/35109.html"

html = get_html(url)

table_lst = get_table_from_html(html)

pprint.pprint(table_lst)

if __name__ == '__main__':

run()

  目前我只使用了几个网页进行测试。如果遇到此方法无法准确爬取的页面,可以给我留言,我会根据页面内容改进此表单爬取方法

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线