Python爬虫学习之每日推送早报新闻到微信
本帖最后由 只有午安 于 2021-10-19 17:04 编辑修改了一下,发现有个新闻没发出来,一开始没注意,修改了一下def caijing 里面的正则表达式
话不多说,代码改一下wx_push的data,再自己部署到云函数里面,就可实现每日自动推送。加油提升自己!
相关库及库的说明
from bs4 import BeautifulSoup
import requests
import re
Beautiful Soup文档
快速上手—Requests
re库官方文档
1、注册一个企业微信
2、编写代码
3、部署云函数
def askURL():
这个方法用来设置请求头,以及获取页面响应的内容。加上utf-8防止乱码。
def getLink():
因为是需要自动获取并推送新闻,该页面的新闻最新的都是在第一篇,所以我们获取最新的早报链接。
没给他设置参数是因为获取早报最新链接的url是固定的。我们直接在方法里面给他写死。
早报链接
def getNews(news_url):
参数:news_url指的是getLink获取到的内容传到这里。
把获取的最新链接传到我们定义的解析方法里面,获取到最新链接里面的内容。再获取我们需要的内容。
def text(content):
参数:content指的是getNews获取到的内容传到这里。
获取到的内容用re库正则表达式来处理内容,如:截取,分割。
因为推送的长度有限制,故我们需要分割内容,分开发送。也更易维护(想要什么版块的内容就定义哪个版块)。具体请看代码。
每日早报格式
def wx_push(newsdata):
参数:newsdata 指的是text处理的内容传到这里。
推送方法,在这里我用的别人重新封装过的企业微信api,他是调用的官方的企业微信api,需要注册一个企业
微信。不用认证企业。具体操作如下。
server酱替代品:企业微信及时通讯api
def main(arg1,arg2):
入口函数,部署云函数需要用到参数arg1,arg2,尽管我们代码用不到这两个参数。
这里调用的是各个def text(content)的方法。
代码相关
def askURL(url):
head = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ""Chrome/92.0"
".4515.107 ""Safari/537.36 "
}
r = requests.get(url, headers=head).content.decode("utf-8")
# print(r)
return r
def getLink(): # 获取最新链接
datalist = []
html = askURL("https://www.pmtown.com/archives/category/%e6%97%a9%e6%8a%a5")
soup = BeautifulSoup(html, "html.parser")
link1 = soup.find("a", class_="media-content", target="_blank")
link1 = str(link1)
link2 = re.findall(link, link1)
datalist.append(link2)
link3 = # 解析列表转成文本
link4 = ''.join(link3)
# print(link4)
return link4
# ---------------------------------------------爬取早报内容-------------------------------------------------#
def getNews(news_url):
news1 = []
html1 = askURL(news_url)
soup2 = BeautifulSoup(html1, "html.parser")
contents = soup2.find("div", class_="post-content")
contents = str(contents)
report = re.findall(news, contents)
report = re.sub("<br(\s+)?/>(\s+)?", "", report) # 替换<br>标签
report = re.sub("/", "", report)
report = re.sub(r'【融资收购.*?【', '【', report).replace("【泡面头条】", "【洛七早报】")
report = str(report)
news1.append(report.strip())
return news1
# -----------------------------------------------text内容-------------------------------------------------------
# 获取内容,先分割,后发送
# 洛七早报 【洛.*(?=【)
# 国内头条 【国.*(?=【)
# 海外头条 【海.*(?=【)
# 体育竞技 【体.*(?=【)
# 财经新闻 【财.*(?=【)
def luoqi(content):
luoqi = re.compile(r'【洛.*?(?=【)')
luoqi1 = re.findall(luoqi, str(content))
luoqi2 =
luoqi3 = ''.join(luoqi2).replace("。", "").replace("1、", "\n1、").replace("2、", "\n2、").replace("3、", "\n3、").replace(
"4、", "\n4、"). \
replace("5、", "\n5、").replace("6、", "\n6、").replace("7、", "\n7、").replace("8、", "\n8、").replace("9、", "\n9、"). \
replace("10、", "\n10、")
# print(luoqi3)
return luoqi3
def guonei(content):
guonei = re.compile(r'【国.*?(?=【)')
guonei1 = re.findall(guonei, str(content))
guonei2 =
guonei3 = ''.join(guonei2).replace("。", "").replace("1、", "\n1、").replace("2、", "\n2、").replace("3、",
"\n3、").replace(
"4、", "\n4、"). \
replace("5、", "\n5、").replace("6、", "\n6、").replace("7、", "\n7、").replace("8、", "\n8、").replace("9、", "\n9、"). \
replace("10、", "\n10、")
# print(guonei3)
return guonei3
def haiwai(content):
haiwai = re.compile(r'【海.*?(?=【)')
haiwai1 = re.findall(haiwai, str(content))
haiwai2 =
haiwai3 = ''.join(haiwai2).replace("。", "").replace("1、", "\n1、").replace("2、", "\n2、").replace("3、",
"\n3、").replace(
"4、", "\n4、"). \
replace("5、", "\n5、").replace("6、", "\n6、").replace("7、", "\n7、").replace("8、", "\n8、").replace("9、", "\n9、"). \
replace("10、", "\n10、")
# print(haiwai3)
return haiwai3
def tiyu(content):
tiyu = re.compile(r'【体.*?(?=【)')
tiyu1 = re.findall(tiyu, str(content))
tiyu2 =
tiyu3 = ''.join(tiyu2).replace("。", "").replace("1、", "\n1、").replace("2、", "\n2、").replace("3、", "\n3、").replace(
"4、", "\n4、"). \
replace("5、", "\n5、").replace("6、", "\n6、").replace("7、", "\n7、").replace("8、", "\n8、").replace("9、", "\n9、"). \
replace("10、", "\n10、")
# print(tiyu3)
return tiyu3
def caijing(content):
caijing = re.compile(r'【财经新闻】.*')
caijing1 = re.findall(caijing, str(content))
caijing2 =
caijing3 = ''.join(caijing2).replace("。", "").replace("1、", "\n1、").replace("2、", "\n2、").replace("3、",
"\n3、").replace(
"4、", "\n4、"). \
replace("5、", "\n5、").replace("6、", "\n6、").replace("7、", "\n7、").replace("8、", "\n8、").replace("9、", "\n9、"). \
replace("10、", "\n10、").replace("\']", "")
# print(caijing3)
return caijing3
# ---------------------------------------------- 推送 ------------------------------------------------ #
def wx_push(newsdata): # 企业微信的推送,用到
data = {
"corpid": "", # 企业ID
"corpsecret": "", # 应用的凭证密钥secret
"agentid": "", # 应用ID
"text": newsdata # 推送内容,支持HTML
}
wxtalk = 'https://api.htm.fun/api/Wechat/text/'
response = requests.get(wxtalk, data=data)
return response
def serverPush(data): # 这是server酱的推送,没用到
data1 = {
"title": "推送",
"desp": data
}
wx_tui = "https://sctapi.ftqq.com/填写你的key.send"
response = requests.post(wx_tui, data=data1)
return response
def qmsgPush(data): # 这是qmsg酱推送,没用到
data2 = {
"msg": data
}
qmsg = "https://qmsg.zendee.cn/send/填写你的key"
response = requests.post(qmsg, data=data2)
return response
def main(arg1,arg2): # 入口函数
link = getLink()
news = getNews(link)
# 微信推送
wx_push(luoqi(news))
wx_push(guonei(news))
wx_push(haiwai(news))
wx_push(tiyu(news))
wx_push(caijing(news))部署云函数相关
由于tx云函数没有Beautiful Soup库,所以我们需要在Pycharm里面打包依赖。
具体操作如下,使用方法二更快。我们需要打包的是:beautifulsoup4-4.10.0.dist-info,bs4这两个包。
把这两个包和你的py文件放在一起添加到zip。我的py文件名叫 News.py,在部署的时候执行方法填写
News.main。最后点击部署。再点击测试,就能出效果了。云函数每个月都有免费额度,每日推送够用了。
为Python云函数打包依赖
效果图:
https://s.pc.qq.com/tousu/img/20211016/3754962_1634365513.jpg
2021.10.19更新了一下,上传云函数测试有警告问题(把soupsieve包也一并压缩,就不警告了),优化了一下推送顺序。(我想要的顺序{:301_988:})
最好有大佬帮忙优化一下代码,看着感觉有点乱(小声bb){:301_999:}
本帖最后由 只有午安 于 2021-10-19 11:55 编辑
打包的就是可以直接上传云函数的。
如果要在pycharm里面运行那就把def main(arg1,arg2):arg1,arg2删除,变成def main():
然后在代码最后面加上
if __name__ == "__main__":
main()
只有午安 发表于 2021-10-19 11:50
。。。我的错def main那里 加两个参数arg1,arg2也就是 def main(arg1,arg2)
ps:
可以试试官方API来推送 ,已测试ok! 供参考:
微信推送参考了其他大佬改进的官方API:
wxid = '***'
wxsecret = '***'
def wx_push(newsdata):
wx_push_token = \
requests.post(url='https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s' % (wxid, wxsecret),
data="").json()['access_token']
wx_push_data = {
"agentid": 1000002,
"msgtype": "text",
"touser": "@all",
"text": {
"content": newsdata
},
"safe": 0
}
requests.post('https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s' % wx_push_token,
json=wx_push_data) 打包楼主的NEWS.ZIP 上传成功后 测试提示如下:
START RequestId:ea7b89a4-25d4-4511-b620-ed0abf2a512b
ERROR RequestId:ea7b89a4-25d4-4511-b620-ed0abf2a512b Result:{"errorCode":1,"errorMessage":"user code exception caught","stackTrace":"Traceback (most recent call last):\nTypeError: main() takes 0 positional arguments but 2 were given","statusCode":430}
END RequestId:ea7b89a4-25d4-4511-b620-ed0abf2a512b
Report RequestId:ea7b89a4-25d4-4511-b620-ed0abf2a512b Duration:1ms Memory:128MB MemUsage:19.769531MB 不错 学习了{:1_893:} 学习了,不过报错,不知道哪里的问题 学以致用,不错 学习了,谢谢楼主分享! 十分不错,个人微信应该也可以吧 Owliver 发表于 2021-10-16 15:06
学习了,不过报错,不知道哪里的问题
报的错误给我看看 好学 发表于 2021-10-16 15:30
十分不错,个人微信应该也可以吧
这个是通过企业微信的应用给自己的普通微信推送的,普通微信暂时没看到有api 谢谢分享 谢谢LZ分享