php抓取网页匹配url(本次特别感兴趣目标去好好学习这门语言开发过程中的思路)

优采云 发布时间: 2022-03-18 18:21

  php抓取网页匹配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&#x27;<p id="zj_area">(.+)&#x27;

3 reg = r&#x27;([0-9])&#x27;

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, &#x27;w&#x27;)

3 in_put.write(str(data))

4 in_put.close()

5

  一个简单的文件保存方法就完成了,解释第二行,因为正则匹配是一个列表,所以需要转换成字符串才能保存到文件中。

  读取文件中的彩票号码

  既然文件被保存了,就需要再次读取文件的内容,否则保存没有意义吧?哈哈哈

  1def getTxt(file): #从文件中读取之前的开奖号码

2 out_put = open(file, &#x27;r&#x27;)

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(&#x27;data.txt&#x27;) #从文件中读取历史开奖号码

5 if openball==oldball:

6 print(&#x27;还没开奖&#x27;)

7 else:

8 insertTxt(&#x27;data.txt&#x27;,openball) #更新开奖号码保存文件

9

10 mail_host="" #设置服务器

11 mail_user="" #用户名

12 mail_pass="" #口令

13

14 message = MIMEText(&#x27;本期七星彩开奖结果&#x27;+openball, &#x27;plain&#x27;, &#x27;utf-8&#x27;)

15 message[&#x27;From&#x27;] = Header("python系统", &#x27;utf-8&#x27;)

16 message[&#x27;To&#x27;] = Header("", &#x27;utf-8&#x27;)

17 subject = &#x27;七星彩开奖结果&#x27;

18 message[&#x27;Subject&#x27;] = Header(subject, &#x27;utf-8&#x27;)

19

20 smtpObj = smtplib.SMTP()

21 smtpObj.connect(mail_host, 25)

22 smtpObj.login(mail_user,mail_pass)

23 smtpObj.sendmail(&#x27;&#x27;,&#x27;&#x27;, message.as_string())

24 print(&#x27;和上次号码不同,已开奖&#x27;)

25

  运行结果

  成功抢到彩票号码并发送电子邮件。

  虽然这里不介绍邮件的功能,但我觉得还是有必要说一下的。我不知道其他邮件服务器如何。当时使用的163服务器,对方返回错误码,大概意思是无法区分我发送的邮件是否为垃圾邮件,服务禁止了我的请求。后来切换到公司的邮件服务器,发送成功。如果你想手动编写发送电子邮件的代码,你可能会遇到一个小问题。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线