如何在第一次运行时将整个程序变为变量,并在第二次创建另一个变量并将它们进行比较?

时间:2017-12-05 17:58:15

标签: python-3.x web-scraping updates

我正在做一个网络抓取程序,它每隔5分钟刮一个信息表就可以了。它打印相同的表,但我想要做的是比较它的第一次运行和名称' num1',并将其与下次运行时进行比较以查看是否发生了任何更新到桌子。我们可以标记这个' num2',我想我需要在终端中标记第一个输出并将其与第二次输出进行比较,并执行以下操作:

if num1 != num2:
    print("updated") 

然后我需要比较' num2'到#num;'等等.... 这是我到目前为止所拥有的:

import urllib
import urllib.request as request
import libxml2

totalurl = "https://www.icc-ccs.org/index.php/piracy-reporting-centre/live-piracy-report"
htmlfile = urllib.request.urlopen(totalurl)
htmltext = htmlfile.read()
source = html.fromstring(htmltext.decode())
num = source.xpath('//div[@class="fabrikDataContainer"]')
print(num[0].text_content())

1 个答案:

答案 0 :(得分:0)

执行刮擦结果的定期比较

如果您想使用cron等定期执行脚本,那么您可以做的是将抓取结果保存到文本文件中,只需在下次执行时加载文本文件以比较更改。

import urllib
import urllib.request as request
import libxml2

totalurl = "https://www.icc-ccs.org/index.php/piracy-reporting-centre/live-piracy-report"
htmlfile = urllib.request.urlopen(totalurl)
htmltext = htmlfile.read()
source = html.fromstring(htmltext.decode())
num = source.xpath('//div[@class="fabrikDataContainer"]')
print(num[0].text_content())
with open('lastresult.txt', 'r+') as f:
    last_content = f.read()
    if num[0].text_content() != last_content:
        print("updated")
    # update last result file
    f.seek(0)
    f.write(num[0].text_content())
    f.truncate()

解决编码问题

新内容与最后一个内容之间的比较总是返回true的原因似乎与编码相关,因为在执行比较和保存到文件之前对字符串进行编码。正确的文件打开模式是'rb +'和'wb',因为你要写文件的字节,而不是字符串。

import os
import urllib
import urllib.request as request
#import libxml2
from lxml import html

totalurl = "https://www.icc-ccs.org/index.php/piracy-reporting-centre/live-piracy-report"
htmlfile = urllib.request.urlopen(totalurl)
htmltext = htmlfile.read()
source = html.fromstring(htmltext.decode())
num = source.xpath('//div[@class="fabrikDataContainer"]')
new_content = str.encode(num[0].text_content(), 'utf8')
# print(new_content.decode('utf8'))
if os.path.exists('lastresult.txt'):
    with open('lastresult.txt', 'rb+') as f:
        last_content = f.read()
        if new_content != last_content:
            print("updated")
        f.seek(0)
        f.write(new_content)
        f.truncate()
else:
    with open('lastresult.txt', 'wb') as f:
        f.write(new_content)

注意:我切换到lxml所以我没有为python3安装libxml2,这是标准的Ubuntu 16.04存储库所没有的。