如何用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月前
|
存储 Java 数据处理
(numpy)Python做数据处理必备框架!(一):认识numpy;从概念层面开始学习ndarray数组:形状、数组转置、数值范围、矩阵...
Numpy是什么? numpy是Python中科学计算的基础包。 它是一个Python库,提供多维数组对象、各种派生对象(例如掩码数组和矩阵)以及用于对数组进行快速操作的各种方法,包括数学、逻辑、形状操作、排序、选择、I/0 、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。 Numpy能做什么? numpy的部分功能如下: ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。 线性代数、随机数生成以及傅里叶变换功能。 用于集成由C、C++
324 1
|
2月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
189 1
|
2月前
|
算法 Java Docker
(Python基础)新时代语言!一起学习Python吧!(三):IF条件判断和match匹配;Python中的循环:for...in、while循环;循环操作关键字;Python函数使用方法
IF 条件判断 使用if语句,对条件进行判断 true则执行代码块缩进语句 false则不执行代码块缩进语句,如果有else 或 elif 则进入相应的规则中执行
292 1
|
2月前
|
存储 Java 索引
(Python基础)新时代语言!一起学习Python吧!(二):字符编码由来;Python字符串、字符串格式化;list集合和tuple元组区别
字符编码 我们要清楚,计算机最开始的表达都是由二进制而来 我们要想通过二进制来表示我们熟知的字符看看以下的变化 例如: 1 的二进制编码为 0000 0001 我们通过A这个字符,让其在计算机内部存储(现如今,A 字符在地址通常表示为65) 现在拿A举例: 在计算机内部 A字符,它本身表示为 65这个数,在计算机底层会转为二进制码 也意味着A字符在底层表示为 1000001 通过这样的字符表示进行转换,逐步发展为拥有127个字符的编码存储到计算机中,这个编码表也被称为ASCII编码。 但随时代变迁,ASCII编码逐渐暴露短板,全球有上百种语言,光是ASCII编码并不能够满足需求
168 4
|
7月前
|
安全 数据安全/隐私保护 Python
Python学习的自我理解和想法(27)
本文记录了学习Python第27天的内容,主要介绍了使用Python操作PPTX和PDF的技巧。其中包括通过`python-pptx`库创建PPTX文件的详细步骤,如创建幻灯片对象、选择母版布局、编辑标题与副标题、添加文本框和图片,以及保存文件。此外,还讲解了如何利用`PyPDF2`库为PDF文件加密,涵盖安装库、定义函数、读取文件、设置密码及保存加密文件的过程。文章总结了Python在处理文档时的强大功能,并表达了对读者应用这些技能的期待。
|
3月前
|
JavaScript Java 大数据
基于python的网络课程在线学习交流系统
本研究聚焦网络课程在线学习交流系统,从社会、技术、教育三方面探讨其发展背景与意义。系统借助Java、Spring Boot、MySQL、Vue等技术实现,融合云计算、大数据与人工智能,推动教育公平与教学模式创新,具有重要理论价值与实践意义。
|
5月前
|
算法 IDE 测试技术
python学习需要注意的事项
python学习需要注意的事项
274 57
|
5月前
|
JSON 数据安全/隐私保护 数据格式
拼多多批量下单软件,拼多多无限账号下单软件,python框架仅供学习参考
完整的拼多多自动化下单框架,包含登录、搜索商品、获取商品列表、下单等功能。
|
5月前
|
机器学习/深度学习 数据安全/隐私保护 计算机视觉
过三色刷脸技术,过三色刷脸技术教程,插件过人脸python分享学习
三色刷脸技术是基于RGB三通道分离的人脸特征提取方法,通过分析人脸在不同颜色通道的特征差异

推荐镜像

更多