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()
解释:
-
getalldoc函数:
注意:首页和后面的页面,网址是不太一样的。
列表页上,我们需要获得a标签下的href内容,然后对链接进行过滤,避免无关链接混入。
-
getall()函数:
页数怎么判断的?我在列表页面大概看了看。其实后面也限定了链接的格式,这里只要稍微限制下就完了。
-
geturl()函数:
细节页面上要看的是: