php抓取网页匹配url(本次特别感兴趣目标去好好学习这门语言开发过程中的思路)
优采云 发布时间: 2022-03-18 18:21php抓取网页匹配url(本次特别感兴趣目标去好好学习这门语言开发过程中的思路)
我一直对 python 很感兴趣,但没有学习好这门语言的目标。昨天,我突然有了一个想法。爸爸喜欢买七星彩票,所以何不把每期的彩票号码通过电子邮件发送给他。这样,他就可以第一时间知道彩票号码了。
然后就开始工作了,但是为什么选择python呢,其实用php可以写得更快。或者是因为看了小蟒蛇没机会练,又或者是懒得练。
这个例子装了标题,把各个方法分开来解释,这也是开发过程中的思路。
研究目标页面
在开始之前,您需要了解一点您将要抓取的页面的结构。
目标地址:
网站编码为utf-8,下面输入代码。
抓取页面代码
1from urllib import request
2def getHtml(url): #获取页面的源代码
3 page = request.urlopen(url)
4 html = page.read()
5 html = html.decode('utf-8')
6 return html
7print(getHtml('http://caipiao.163.com/award/qxc/'))
8
获取页面代码其实很简单,引入urllib库。该方法的第一行打开一个 url 地址。此时,得到一个对象。整个页面的代码可以通过read()方法得到,然后使用utf-8编码(网站编码)使代码中文可以看懂。
我们来看看运行结果。
伙计,出事了。在这里爬了一个小时,用了各种代码报错。后来百度来了一句:有些网站为了快速加载压缩了代码。然后伴随着这句话,我真的找到了一个python解压库。修改代码后
1from urllib import request
2import gzip
3def getHtml(url): #获取页面的源代码
4 page = request.urlopen(url)
5 html = page.read()
6 html = gzip.decompress(html)
7 html = html.decode('utf-8')
8 return html
9 print(getHtml('http://caipiao.163.com/award/qxc/'))
10
运行结果如下
终于拿到前端代码了。
正则表达式匹配所需的值
所需的内容被框在两个 p 标签中。稍微看了一下,我决定用两个规律来获取彩票号码。首先取出p标签中的内容,然后得到抽奖号码。
1def getball(html): #正则匹配出开奖号码
2 regall = r'<p id="zj_area">(.+)'
3 reg = r'([0-9])'
4 balllist = re.findall(regall,html)
5 openball = re.findall(reg,balllist[0])
6 return openball
7
</p>
因为我不是很会写正则表达式,所以匹配了两次,有点傻,不过这里是可行的。如果有更好的搭配方式,欢迎讨论。
操作的结果被带到下面的列表中
['6', '6', '6', '6', '4', '5', '8']
这里的抽奖号码已经完成了,但离我的目标还很远。我需要比较每个彩票的结果并通过电子邮件发送最新的彩票号码。
保存彩票号码
为什么要保存彩票号码?因为每次抓到的不一定是最新的开奖号码,所以需要新旧对比才能知道最新的开奖号码被抓到了,只有在抓到最新的号码后才发邮件。
在此处选择要保存的文件
1def insertTxt(file,data): #将开奖号码保存到文件中
2 in_put = open(file, 'w')
3 in_put.write(str(data))
4 in_put.close()
5
一个简单的文件保存方法就完成了,解释第二行,因为正则匹配是一个列表,所以需要转换成字符串才能保存到文件中。
读取文件中的彩票号码
既然文件被保存了,就需要再次读取文件的内容,否则保存没有意义吧?哈哈哈
1def getTxt(file): #从文件中读取之前的开奖号码
2 out_put = open(file, 'r')
3 result = out_put.read()
4 out_put.close()
5 return result
6
在这里,从文件中提取之前保存的旧彩票号码,用于与当前捕获的彩票号码进行比较。如果编号相同,则不予处理。如果不相同,则文件将被替换,新的彩票号码将通过邮件发送。
整体处理功能
在下面的代码中,我直接写了发送邮件的逻辑。这里隐藏了邮件的相关信息,不解释发送邮件的相关内容。有兴趣可以自己研究,用python自带的。smtp 库。
1def deal(url): #主逻辑
2 html = getHtml(url)
3 openball = str(getball(html)) #将开奖的list转换成str
4 oldball = getTxt('data.txt') #从文件中读取历史开奖号码
5 if openball==oldball:
6 print('还没开奖')
7 else:
8 insertTxt('data.txt',openball) #更新开奖号码保存文件
9
10 mail_host="" #设置服务器
11 mail_user="" #用户名
12 mail_pass="" #口令
13
14 message = MIMEText('本期七星彩开奖结果'+openball, 'plain', 'utf-8')
15 message['From'] = Header("python系统", 'utf-8')
16 message['To'] = Header("", 'utf-8')
17 subject = '七星彩开奖结果'
18 message['Subject'] = Header(subject, 'utf-8')
19
20 smtpObj = smtplib.SMTP()
21 smtpObj.connect(mail_host, 25)
22 smtpObj.login(mail_user,mail_pass)
23 smtpObj.sendmail('','', message.as_string())
24 print('和上次号码不同,已开奖')
25
运行结果
成功抢到彩票号码并发送电子邮件。
虽然这里不介绍邮件的功能,但我觉得还是有必要说一下的。我不知道其他邮件服务器如何。当时使用的163服务器,对方返回错误码,大概意思是无法区分我发送的邮件是否为垃圾邮件,服务禁止了我的请求。后来切换到公司的邮件服务器,发送成功。如果你想手动编写发送电子邮件的代码,你可能会遇到一个小问题。