python-用BeautifulSoup爬取某教育平台面试每日一练题目及答案

2020/8/24 更新:爬取政府工作报告

事业编面试基本是跪了(10进2,我排第四吧),之后我再写一篇准备心得。(虽然可能没啥价值)
面试前爬取了2020和2019的政府工作报告,这里可以直接拿去用。

def get_gov(testurl, file):
    res = requests.get(testurl, headers=headers)
    # 更改网页编码--------不改会乱码
    res.encoding = "utf-8"
    # 创建一个BeautifulSoup对象
    soup = BeautifulSoup(res.text, "html.parser")
    ans = soup.find_all([["p","h5"], "conlun2_box_text"])
    # 用来储存最后需要写入文件的字符串
    mlist = ""
    for tag in ans:
        # 获取p标签下的string内容,并进行目标字符串拼接
        s = str(tag.string)
        if s == 'None': continue
        mlist = mlist + s + "\n"
    # 返回目标字符串
    with open(file, "a+") as file:
        file.write(mlist)
       
if __name__ == "__main__":
    #getall()
    get_gov("http://www.gov.cn/guowuyuan/zfgzbg.htm","gov-2020.txt")
    get_gov("http://www.gov.cn/guowuyuan/2019zfgzbg.htm","gov-2019.txt")

最近要裸面事业编,临时抱佛脚。。。
先拿某教育平台每日一练的题目看看吧。。顺便也回顾一下爬虫。

请理性使用!!!祝文中的教育平台越办越好!!!谢谢!!!

注释已经充分了,所以直接上代码:

import requests
from bs4 import BeautifulSoup
import os

# 服务器反爬虫机制会判断客户端请求头中的User-Agent是否来源于真实浏览器,所以,我们使用Requests经常会指定UA伪装成浏览器发起请求
headers = {'user-agent': 'Mozilla/5.0'}

# 写文件
def writedoc(raw_ss, i, ii):
    # 打开文件
    # 编码为utf-8
    # 砍掉这些=。=
    start = raw_ss.find("模拟试题")
    end = raw_ss.find("免责声明")
    ss = raw_ss[start+5: end-5]
    # 我把一页的题目合在一起了
    with open("result\\第" + str(ii) + "页.txt", 'a', encoding='utf-8') as f:
        # 写文件
        f.write(ss + "\n\n")
    
# 根据详细页面url获取目标字符串
def geturl(url):
    # 请求详细页面
    r = requests.get(url, headers=headers)
    # 改编码
    r.encoding = "GB2312"
    soup = BeautifulSoup(r.text, "html.parser")
    # 找出类名为 offcn_shocont 下的所有p标签
    ans = soup.find_all(["p", ".offcn_shocont"])
    # 用来储存最后需要写入文件的字符串
    mlist = ""
    for tag in ans:
        # 获取p标签下的string内容,并进行目标字符串拼接
        mlist = mlist + str(tag.string)
    # 返回目标字符串
    return mlist
    
# 获取目标网址第几页
def getalldoc(ii):
    if ii == 1:
        testurl = "http://www.offcn.com/mianshi/mryl/"
    else:
    # 字符串拼接成目标网址
        testurl = "http://www.offcn.com/mianshi/mryl/" + str(ii) + ".html"
    # 使用request去get目标网址
    res = requests.get(testurl, headers=headers)
    # 更改网页编码--------不改会乱码
    res.encoding = "GB2312"
    # 创建一个BeautifulSoup对象
    soup = BeautifulSoup(res.text, "html.parser")

    # 函数返回的是一个list
    ans = soup.find_all("a")
    # 用于标识问题
    cnt = 1
    # 先创建目录
    # 如果需要分页爬取,那么路径只要写到对应就好了
    #mkdir("result\\第" + str(ii) + "页\\")
    for tag in ans:
        # 获取a标签下的href网址,下面这个写法会漏掉链接,我还没研究是因为啥
        #string_ans = str(tag.a.get("href"))
        string_ans = str(tag.get("href"))
        # 我只要三年的
        if string_ans.find("/mianshi/2020/") == -1 and string_ans.find("/mianshi/2019/") == -1 and string_ans.find("/mianshi/2020/") == -1:
            continue
    
        # 请求详细页面
        # 返回我们需要的字符串数据
        string_write = geturl(string_ans)
        # 写文件到磁盘
        writedoc(string_write, cnt, ii)
        cnt = cnt + 1
        
def getall():
    for i in range(1, 10, 1):
        getalldoc(i)
        print(str(i) + " end!")
        
if __name__ == "__main__":
    getall()

解释:

  1. getalldoc函数:
    注意:首页和后面的页面,网址是不太一样的。
    在这里插入图片描述
    列表页上,我们需要获得a标签下的href内容,然后对链接进行过滤,避免无关链接混入。
    在这里插入图片描述

  2. getall()函数:
    页数怎么判断的?我在列表页面大概看了看。其实后面也限定了链接的格式,这里只要稍微限制下就完了。
    在这里插入图片描述

  3. geturl()函数:
    细节页面上要看的是:
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值