用python帮你扒数据

前几天公众号私信我说可以开通付费文章的功能,一个150+关注量的小号也可以有付费文章,让我倍感新鲜。用这篇文章来试试,也仅仅在这一篇上试试,毕竟付费了就没人看了……正文已经全部显示,应该不会影响阅读的~

最近想写一篇文章,题目都想好了,叫《“双一流”高校治理体系的现代化——基于42所高校大学章程的文本分析》。起这个标题是因为之前看有篇博士论文说,“大学章程是高校内部治理结构形成的基础和灵魂,在应然状态下,高校内部的治理结构只能是大学章程的衍生品并严格参照章程行事。”(引自:李永亮. 高等学校内部治理结构优化研究[D]. 山东大学, 2016.)好像很厉害的样子,应该能研究出点东西。

做这个题目的过程中,一个比较重要的问题,42所双一流高校的大学章程文本去哪里找,当然不想一个个学校官网去复制粘贴……在浏览教育部官网的时候,发现官网上有,整理得整整齐齐。

点击浏览网页,发现有我们想要的内容,找了几个与官网比对之后,发现内容一致。查看了网页的HTML结构,发现比较一致,是结构化的。那么,使用python自动的帮我们把这些数据扒下来,也就能够帮助我们在数据获取阶段省下比较多的时间。

自动化获取网页数据的过程叫做爬虫,我是硕士的时候学的python,随便学了爬虫,但是还用爬虫自动下载文献(Python+Selenium,让浏览器自动帮你下文献)。最近数据安全方面立法开始受到重视,在查阅了《网络安全法》、《数据安全管理办法(征求意见稿)》等法规后,总结起来,假如不涉及个人隐私、不非法进入他人网页(例如破解他人账户、密码等)、不频繁访问他人网页(如DDOS攻击等),那么这样的爬虫就是善意的爬虫。大学章程信息放在教育部官网的“信息公开专栏”,不涉及个人隐私,同时为了保险起见,使用python中网络连接最基本的requests库,并在访问各个页面的过程中设置时间间隔,模拟人的点击行为。也就是写个小虫子,帮你自动访问、复制、粘贴、保存,这样的爬虫,也可以成为“科研小助手”。编程的思路如下:

1.分析列表页面,获取内容页链接;2.分析所有内容页页面结构,获取并存储文本;3.存储信息。

1、获取内容页链接

在分析开始之前,我们需要引入需要的库。引入这些库的目的如注释所示。

import requests #访问链接
from lxml import etree #解析网页
import time # 设置停顿时间
import pandas as pd #存储数据

同时,需要写一个函数,我们用这个函数访问、获取并解析网页,最基础的也就3行代码。

# 基础访问函数
def get_url(url):
    header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'}
    response = requests.get(url, headers=header)
    html = etree.HTML(response.content.decode('utf-8'))
    return html

完成上述准备工作后,开始分析需要爬取的界面,我们大学章程文本的列表页的链接为:http://www.moe.gov.cn/srcsite/A02/zfs_gdxxzc,一个页面有20条信息。一共7个页面,需要写一个循环语句来遍历这7个页面。分析发现,只需要在这个链接之后加上“/index_1.html”、“/index_2.html”等就可以翻页到第2页、第3页等(例如“http://www.moe.gov.cn/srcsite/A02/zfs_gdxxzc/index_1.html”是第二页)。所以定义一个url_group,把所有列表页的链接存储起来。

base_url = 'http://www.moe.gov.cn/srcsite/A02/zfs_gdxxzc'
url_group = [base_url]
for i in range(6):
    url_group.append(base_url+'/index_{}.html'.format(i+1))

然后,在浏览器按F12进入开发者模式,分析网页结构。

分析得到,画框框的部分为需要获取的内容,“1”是放置着所有列表的div,其class选择器的名字'xxgk_tylb_nr',“2”是时间,“3”是链接和标题。我们使用xpath解析每个文本的标题、时间和链接,并定义了一个items_data数组,循环存储在这个数组中,代码如下所示。

# 获取每一个文本的链接
def get_items(url, items_data):
    html = get_url(url)
    items_text = html.xpath(".//div[@class='xxgk_tylb_nr']/ul//a/text()")
    items_time = html.xpath(".//div[@class='xxgk_tylb_nr']/ul//span/text()")
    items_href = html.xpath(".//div[@class='xxgk_tylb_nr']/ul//a/@href")
    for i in range(len(items_href)):
        items_data.append([items_text[i],items_time[i],items_href[i]])
    return items_data

2、获取文本

得到文本的链接后,我们开始分析内容页的结构。

在文本开始的地方,有一个表格,有信息名称、信息索引、生成日期、发文机构、发文字号、信息类别、内容概述,想着可能以后有用,可以把它们都爬取下来。

分析正文部分的网页结构,同样重点内容用画框框的部分标注出来,“1”是放置着所有内容的div,其id选择器的名字'xxgk_content_div',“2”是标题,是一个h1(在css中h1是一级标题的意思),“3”正文的内容,是一组p(在css中p是段落的意思)。我们同样使用xpath解析,定义一个items_data数组,循环存储在这个数组中。最后,使用open()函数将数据写入txt。

“a”是open函数打开的模式,打开一个文件用于追加。如果该文件已存在,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件并进行写入。这种模式适合逐行写入。

# 获取文本链接和信息
def get_detail(url, name, info_group):
    html = get_url(url)


    # 获取表格信息
    info = html.xpath(".//div[@id='content_body_xxgk']//td[@class='gongkai_font_gray']/text()")
    info_group.append(info)


    # 获取标题
    items_head = ''.join(html.xpath(".//div[@id='xxgk_content_redheadbg']//h1/text()"))


    # 获取文本
    items_text = html.xpath(".//div[@id='xxgk_content_div']//p/text()")


    # 存储文本
    fileName = 'result/文本数据/' + name + '.txt'
    with open(fileName, 'a', encoding="utf-8") as f:
        f.write(items_head)
        f.write('\n\n')
        for text in items_text:
            f.write(text)
            f.write('\n\n')
    return info_group

所有的函数写完,然后调用这些函数,获取所有的文本链接,并获取文本。

# 获取文本链接
items_data = []
for url in url_group:
    items_data = get_items(url, items_data)
    print(url)
    time.sleep(1)
print(len(items_data))


# 获取并存储文本
info_group = []
for data in items_data:
    name = data[0]
    href = data[2]
    url = base_url + href[1:]
    info_group = get_detail(url, name, info_group)
    print(url)
    time.sleep(1)
print(len(items_data))

写代码2.5小时,跑代码2.5分钟。比手动复制粘贴保存一个晚上有意思得多。

看到扒下来的100多个文本,还是很有充实感的。

3、存储信息

之前得到了存储链接的数组items_data和存储文本详细信息的数组info_group,写一段代码把他们存到excel里,以备后面使用。

# 存储结构化数据
def get_excel(column, data_group, name):
    df = pd.DataFrame(data_group, columns=column)
    fileName = 'result/' + name + '.xlsx'
    df.to_excel(fileName)


column1 = ['标题','时间','链接']
column2 = ['信息名称','信息索引','生成日期','发文机构','发文字号','信息类别','内容概述']
name1 = '索引信息'
name2 = '文本信息'
get_excel(column1, items_data, name1)
get_excel(column2, info_group, name2)

得到的表格,也是工工整整。

写在后面

扒数据也许是人文社会科学领域同学的一个绕不开的话题了,我也有过元旦前去扒数据的经历 - -

今天看《探究的场所》有一句话挺受触动,“这种训练可能仅仅包括把学生主要当做廉价劳动力使用的狭窄技能的训练,用美国的话叫‘干弯腰活的劳动力’。”我觉得,机械、重复、不需要创造性的活可能还是交给电脑会比较好一点,留更多的时间思考、写作才能让时间过得充实一点。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值