如何用python“考上”研究生?学习了!

简介: 在日常的学习和工作中我们听到最多的一句话就是”提质增效“,在考研的准备过程中也不例外, 因为考研是一场需要好好准备才有收获的战斗,那么在考研中如何快速准确的收集自己需要的考研资料呢?我们以python收集何凯文考研英语的每日一句为例,来谈谈如何高效的整理自己的考研资料,让编程赋能学习, 用python来提质增效,考上自己理想的985。

基本原理:对于网页上的学习资料,很适合用python 爬虫来收集

我们仔细分析了一下考研每日一句(https://bj.wendu.com/zixun/yingyu/6697.html)的网页结构,可以使用chrome 浏览器 F12 来调试查看或者使用比较专业一点的工具Fiddler 来抓取网页请求并查看网页的html DOM文件构造,该网页为一个table 里填充了三百多个a标签,指向了正文内容的链接,我们需要先把这三百多个链接收集起来,再逐一访问,并解析网页,获取内容,然后写入word文档。

这里用到三个python 模块,分别如下:

  • requests 负责处理http协议,来完成网页请求。
  • xpath 负责解析网页DOM文件,处理html。
  • python-docs 负责处理word样式,写入word文档。


01

版本1 DailyEnglishGet-v1.py

在版本1中,我们没有用多线程,只是顺序的执行,每一句都单独写入一个文件,但效率会慢一些,完成300多句的收集,会花一点时间。效果如图1 和 图2:


100.png


(图1)


0.png


(图2)


######################################################################################
#
# Author: zuoguocai@126.com
#
# Function: Get daily english TO DOCX file  Version 1.0
#
# Modified Time:  2021年5月25日
# 
# Help:  need install  requests,lxml and python-docx
#        pip3 install requests lxml python-docx -i https://pypi.douban.com/simple
#        Test successfully in WIN10  and python3.9
#
######################################################################################
#!/usr/bin/env python
import requests
# 忽略请求https,客户端没有证书警告信息
requests.packages.urllib3.disable_warnings()
from lxml import etree
from docx import Document
from docx.shared import Inches
import time
import random
url = "https://bj.wendu.com/zixun/yingyu/6697.html"
headers = {
   'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36'
}
# 获取表格中 所有a标签链接
r = requests.get(url,headers=headers,verify=False,timeout=120)
html = etree.HTML(r.text)
html_urls = html.xpath("//tr//a/@href")
num_count = len(html_urls)
print("总共发现:   {}句".format(num_count))
# 获取链接下内容
for i in html_urls:
 r = requests.get(i, headers=headers, verify=False,timeout=120)
 result_html = etree.HTML(r.content, parser=etree.HTMLParser(encoding='utf8'))
 html_data = result_html.xpath('//div[@class="article-body"]/p//text()')
 # 获取标题
 head = html_data[1]
 Message = "正在处理===>" + head  + "  "+ i + "  请稍等..."
 print(Message)
 # 句子和问题
 juzi = '\n'.join(html_data[2:4])
 # 选项
 xuanxiang = '\n'.join(html_data[4:10])
 # 分析
 fengxi = '\n'.join(html_data[10:-4])
 # 合并为内容,中间以换行符分隔
 content = "\n\n\n".join((head,juzi,xuanxiang,fengxi))
 file_name = 'C:\\Users\\zuoguocai\\Desktop\\pachong\\docs\\' + head + '.docx'
 document = Document()
 paragraph = document.add_paragraph(content)
 document.save(file_name)
 # 限制请求
 myrandom = random.randint(3,10)
 time.sleep(myrandom)


02

版本2 DailyEnglishGet-v2.py

在版本2中,我们使用了多线程,仍然是每一句都单独写入一个文件,这次效率会很高,较版本1节约了至少10倍时间。但是由于请求太频繁,会出现空文档。


######################################################################################
#
# Author: zuoguocai@126.com
#
# Function: Get daily english TO DOCX file Version 2.0
#
# Modified Time:  2021年5月25日
# 
# Help:  need install  requests,lxml and python-docx
#        pip3 install requests lxml python-docx -i https://pypi.douban.com/simple
#        Test successfully in WIN10  and python3.9
#
######################################################################################
#!/usr/bin/env python
import requests
# 忽略请求https,客户端没有证书警告信息
requests.packages.urllib3.disable_warnings()
from lxml import etree
from docx import Document
from docx.shared import Inches
import time
import random
import concurrent.futures
url = "https://bj.wendu.com/zixun/yingyu/6697.html"
headers = {
   'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36'
}
# 获取表格中 所有a标签链接
r = requests.get(url,headers=headers,verify=False,timeout=120)
html = etree.HTML(r.text)
html_urls = html.xpath("//tr//a/@href")
num_count = len(html_urls)
print("总共发现:   {}句".format(num_count))
# 获取链接下内容, 去除广告内容
def craw(url):
 r = requests.get(url, headers=headers, verify=False,timeout=120)
 result_html = etree.HTML(r.content, parser=etree.HTMLParser(encoding='utf8'))
 html_data = result_html.xpath('//div[@class="article-body"]/p//text()')
 # 获取标题
 head = html_data[1]
 # 句子和问题
 juzi = '\n'.join(html_data[2:4])
 # 选项
 xuanxiang = '\n'.join(html_data[4:10])
 # 分析
 fengxi = '\n'.join(html_data[10:-4])
 # 合并为一篇内容,中间以换行符分隔
 content = "\n\n\n".join((head,juzi,xuanxiang,fengxi))
 file_name = 'C:\\Users\\zuoguocai\\Desktop\\pachong\\docs\\' + head + '.docx'
 # 写入word文档 
 document = Document()
 paragraph = document.add_paragraph(content)
 document.save(file_name)
 Message = "正在处理===>" + head  + "  "+ url + "  处理完成..."
 return Message
# 使用线程池加速IO操作, 缺点:可能因为网络问题或者网站限制,导致出现空文件
with concurrent.futures.ThreadPoolExecutor() as pool:
   futures =  [ pool.submit(craw,url) for url in html_urls ]
   for future in futures:
       print(future.result())



03

版本3 DailyEnglishGet-v3.py

在版本3中,我们没有使用多线程,主要是避免出现版本2中的空文档,慢点也行,至少要保证收集的内容完整。这次没有每一句都单独写入一个文件,而是所有的句子都写到一个文档中,并且加了考研试卷专用字体 Times New Roman 。 效果如图3:


1.png


######################################################################################
#
# Author: zuoguocai@126.com
#
# Function: Get daily english TO DOCX file  Version 3.0
#
# Modified Time:  2021年5月25日
# 
# Help:  need install  requests,lxml and python-docx
#        pip3 install requests lxml python-docx -i https://pypi.douban.com/simple
#        Test successfully in WIN10  and python3.9
#
######################################################################################
#!/usr/bin/env python
import requests
# 忽略请求https,客户端没有证书警告信息
requests.packages.urllib3.disable_warnings()
from lxml import etree
from docx import Document
from docx.shared import Inches
import time
import random
url = "https://bj.wendu.com/zixun/yingyu/6697.html"
headers = {
   'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36'
}
# 获取表格中 所有a标签链接
r = requests.get(url,headers=headers,verify=False,timeout=120)
html = etree.HTML(r.text)
html_urls = html.xpath("//tr//a/@href")
num_count = len(html_urls)
print("总共发现:   {}句".format(num_count))
# 获取链接下内容
for i in html_urls:
 r = requests.get(i, headers=headers, verify=False,timeout=120)
 result_html = etree.HTML(r.content, parser=etree.HTMLParser(encoding='utf8'))
 html_data = result_html.xpath('//div[@class="article-body"]/p//text()')
 # 获取标题
 head = html_data[1]
 #print(head)
 Message = "正在处理===>" + head  + "  "+ i + "  请稍等..."
 print(Message)
 # 句子和问题
 juzi = '\n'.join(html_data[2:4])
 # 选项
 xuanxiang = '\n'.join(html_data[4:10])
 # 分析
 fengxi = '\n'.join(html_data[10:-4])
 # 合并为一篇内容,中间以换行符分隔
 content = "\n\n\n".join((juzi,xuanxiang,fengxi))
 #把300多句写入到一个文件里,每次打开后追加新内容,需要提前建立一个word空文件并需要写一个标题,设置标题样式
 #python-docx仅可使用文档中定义的样式,因此您需要将该样式添加到模板文档中才能使用它,否则会报错
 file_name = 'C:\\Users\\zuoguocai\\Desktop\\pachong\\docs\\' +  '何凯文每日一句.docx'
 document = Document(file_name)
 # 设置字体为 考研试卷专用字体 Times New Roman 
 # 选中全部,设置为宋体,选中全部,设置为Times New Roman  
 document.styles['Normal'].font.name = u'Times New Roman'
 # 设置标题1,为后续 在word中查看方便(视图--导航窗格)做准备,为后续在 word中 生成目录做准备(引用--目录--自动目录)
 # 或者使用考虑使用win32com.client包对于目录进行操作
 document.add_heading(head, level=1)
 document.add_paragraph(content)
 document.add_page_break()
 document.save(file_name)
 # 限制请求
 myrandom = random.randint(3,10)
 time.sleep(myrandom)


综上,我们尽可能的尝试优化代码的逻辑来使我们收集的内容更加完整,执行效率更高,但仍不完美,有待进一步探索,但在期间 优化逻辑的过程也有另外一番乐趣。在今后的工作和学习中,用python 来提质增效,这样我们能把重复繁杂的工作自动化, 拿出更多的时间来思考未来,这是一件大有裨益的事情。友情提醒:爬虫虽好,请恰当使用,本案例仅用于非商业用途,请尊重原作者版权。本案例源码下载地址:https://github.com/ZuoGuocai/DailyEnglishGet

作者简介:左国才,阿里云布道师,笔名icai,致力于企业的数字化转型,主要研究云计算、大数据、DevSecOps领域相关技术,平时喜欢阅读脚本之家公众号。 声明:本文为 脚本之家专栏作者 投稿,未经允许请勿转载。
相关文章
|
2月前
|
PyTorch Linux 算法框架/工具
pytorch学习一:Anaconda下载、安装、配置环境变量。anaconda创建多版本python环境。安装 pytorch。
这篇文章是关于如何使用Anaconda进行Python环境管理,包括下载、安装、配置环境变量、创建多版本Python环境、安装PyTorch以及使用Jupyter Notebook的详细指南。
296 1
pytorch学习一:Anaconda下载、安装、配置环境变量。anaconda创建多版本python环境。安装 pytorch。
|
2月前
|
机器学习/深度学习 人工智能 架构师
Python学习圣经:从0到1,精通Python使用
尼恩架构团队的大模型《LLM大模型学习圣经》是一个系统化的学习系列,初步规划包括以下内容: 1. **《Python学习圣经:从0到1精通Python,打好AI基础》** 2. **《LLM大模型学习圣经:从0到1吃透Transformer技术底座》**
Python学习圣经:从0到1,精通Python使用
|
2月前
|
机器学习/深度学习 缓存 PyTorch
pytorch学习一(扩展篇):miniconda下载、安装、配置环境变量。miniconda创建多版本python环境。整理常用命令(亲测ok)
这篇文章是关于如何下载、安装和配置Miniconda,以及如何使用Miniconda创建和管理Python环境的详细指南。
441 0
pytorch学习一(扩展篇):miniconda下载、安装、配置环境变量。miniconda创建多版本python环境。整理常用命令(亲测ok)
|
2月前
|
开发者 Python
Python学习九:file操作
这篇文章是关于Python文件操作的详细教程,包括文件的打开、读写、关闭,以及文件备份脚本的编写和文件定位操作。
23 2
|
2月前
|
Java C# Python
Python学习七:面向对象编程(中)
这篇文章是关于Python面向对象编程的中级教程,涵盖了析构函数、对象的三大特征(封装、继承、多态)、类属性与实例属性、以及类方法与静态方法的对比。
25 2
|
2月前
|
设计模式 安全 JavaScript
Python学习八:面向对象编程(下):异常、私有等
这篇文章详细介绍了Python面向对象编程中的私有属性、私有方法、异常处理及动态添加属性和方法等关键概念。
26 1
|
2月前
|
存储 Java 编译器
Python学习三:学习python的 变量命名规则,算数、比较、逻辑、赋值运算符,输入与输出。
这篇文章是关于Python编程语言中变量命名规则、基本数据类型、算数运算符、比较运算符、逻辑运算符、赋值运算符以及格式化输出与输入的详细教程。
23 0
Python学习三:学习python的 变量命名规则,算数、比较、逻辑、赋值运算符,输入与输出。
|
2月前
|
资源调度 前端开发 JavaScript
Python学习二:Python包管理器pip
这篇文章介绍了Python包管理器pip的基本概念、基本操作、如何更改下载源为国内镜像以加速下载,以及如何指定安装包的位置。
61 0
Python学习二:Python包管理器pip
|
2月前
|
设计模式 运维 安全
Python学习—装饰器的力量 (一)
Python学习—装饰器的力量 (一)
21 1
|
2月前
|
机器学习/深度学习 人工智能 架构师