如何使用云服务器ECS部署爬虫

首先确定爬虫实现的功能为:爬取最新的公告并推送

因此每次执行爬虫操作时得到的应该是网站最新的一条公告,那么如何保证每次推送的都是最新消息呢?这里用到了数据库sqlite3,将每次得到的最新公告先在数据库中进行查询,如果为,说明该公告未被推送过推送到微信,并且将这条记录插入到数据库;如果数据库已经存在该记录,那么说明不是最新公告不执行推送操作。这样就解决了保证每次推送的公告不重复,并且是最新公告的问题。因此关于数据库的操作应该为,爬虫项目在执行时就初始化数据库,该操作主要是不存在数据库则建立数据库,并且建表;否则连接数据库

其次是要生成请求,得到响应。这里主要用到的是urllib,并且需要在请求中填入用户代理,即2.1.1中提到的user-agent,以便爬虫伪装浏览器得到html页面。

然后就是使用BeautifulSoup 分析得到html页面中的标签,以得到自己所需要的内容。这里只需要得到公告标题标签中的网址后缀发送公告的日期三个内容,然后合成一个字典返回。

最后就是推送到微信。这一步还需要拆解成两个方法来编写:首先需要一个保存数据的方法,尝试将得到的内容保存到数据库,这一步的作用是如果保存成功,则说明是最新通告,因此才能推送到微信,否则不进行操作,因此需要一个分支语句。

根据以上的思路分析,实际需要编写的方法应该为5个。

首先是初始化数据库,传入数据库的路径,若存在则连接,否则建立数据库。

def init_db(dbpath): sql = ''' create table if not exists 'notice_info' ( title text, date text ) ''' connect = sqlite3.connect(dbpath) # 打开或创建数据库 c = connect.cursor() # 获取游标 c.execute(sql) # 执行SQL语句 connect.commit() # 提交事务 connect.close() # 关闭

然后是发送请求,发送响应,即得到一个网页的内容,这里进行了异常的捕捉。

# 得到一个URL的网页内容 def askURL(url): head = { # 用户代理,告诉服务器我们可以接收什么水平的内容 'User-Agent': 'Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / ' '100.0.4896.60 Safari / 537.36 Edg / 100.0.1185.29 ' } request = urllib.request.Request(url, headers=head) # 生成请求 try: reponse = urllib.request.urlopen(request) # 发送请求,获取相应 html = reponse.read() # 读取网页内容 except urllib.error.URLError as e: # 捕捉异常 if hasattr(e, "code"): print(e.code) if hasattr(e, "reason"): print(e.reason) return html

其次是提取需要的内容,首先使用BeautifulSoup 解析网页,然后使用select方法进行层级解析,并形成一个字典返回

# 提取网页的最新通告,主要使用bs4 # 直接提取li标签的第一条,即最新的通知,形成一个字典返回 def dataExtarct(html): bs = BeautifulSoup(html, "html.parser") # 解析文档,作为解析器 li_list = bs.select("ul > li > span > a") # 层级解析 li_list2 = bs.select("ul > li > strong") mydata = { "href": base_URL + li_list[0].get("href"), "title": li_list[0].get_text(), "date": li_list2[0].get_text() } return mydata

最后是推送到微信,推送前需要尝试保存数据,若保存成功则发送数据,否则不执行操作。save_data方法首先是利用SQL语句统计数据库中是否存在该记录,若存在返回0,表示不推送消息,否则需要插入数据,并且返回1,推送消息。

def insert_data(mydata, connect): sql = "insert into notice_info(title, date) values('" + mydata["title"] + "', '" + mydata["date"] + "');" c = connect.cursor() c.execute(sql) connect.commit() # 提交事务 connect.close() # 关闭 def save_data(mydata, dbpath): sql = "select * from notice_info where title = '" + mydata["title"] + "' and date = '" + mydata["date"] + "';" print(sql) connect = sqlite3.connect(dbpath) # 打开或创建数据库 c = connect.cursor() # 获取游标 cursor = c.execute(sql) # 执行SQL语句 result = 0 for row in cursor: print(row) result += 1 if result == 0: insert_data(mydata, connect) return 1 else: return 0

推送消息比较简单,利用虾推啥将文字通过post方法推送,最大可推送64k文字。

# 利用吓推啥,将最新消息推送到微信上 # 主要是获取微信的token def sendMessage(token, mydata): baseurl = "http://wx.xtuis.cn/" url = baseurl + token + ".send" data = { "text": mydata["title"], "desp": '内容:' + mydata["title"] + '<br>' \ '网址:' + mydata["href"] + '<br>' \ '日期:' + mydata["date"] } requests.post(url, data=data)

原文链接:https://help.aliyun.com/practice_detail/427638

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享