- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试编写一个程序,从网页中提取 html,然后将其与我之前保存的抓取数据进行比较。如果发生了变化,它会将新的 html 保存到文本文件中并通过电子邮件发送给我。问题是,它要么偶尔向文本文件写入文本,要么根本不写入文本,然后即使没有任何更改,也会随机向我发送电子邮件。我已经玩了两周了,似乎不明白发生了什么。救命!
import requests
import smtplib
import bs4
import os
abbvs = ['MCL', 'PFL', 'OPPL', 'FCPL', 'AnyPL', 'NOLS', 'VanWaPL', 'SLCPL', 'ProPL', 'ArapPL']
openurls = open('/home/ian/PythonPrograms/job-scrape/urls', 'r')
urls = openurls.read().strip('\n').split(',')
olddocs = ['oldMCL', 'oldPFL', 'oldOPPL', 'oldFCPL', 'oldAnyPL', 'oldNOLS', 'oldVanWaPL', 'oldSLCPL', 'oldProPL', 'oldArapPL']
newdocs = ['newMCL', 'newPFL', 'newOPPL', 'newFCPL', 'newAnyPL', 'newNOLS', 'newVanWaPL', 'newSLCPL', 'newProPL', 'newArapPL']
bstags = ['#content', '.col-md-12', '#main', '#containedInVSplit', '.col-sm-7', '.statement-left-div', '#main', '#main', '#componentBox', '.list-group.job-listings']
for url in urls:
res = requests.get(url)
res.raise_for_status()
for bstag in bstags:
currentsoup = bs4.BeautifulSoup(res.text, "lxml")
newsoup = currentsoup.select(bstag)
for newdoc in newdocs:
if os.path.isfile('/home/ian/Pythonprograms/job-scrape/libsitehtml/'+newdoc) == False:
createnew = open('/home/ian/PythonPrograms/job-scrape/libsitehtml/'+newdoc, 'w')
file = open('/home/ian/PythonPrograms/job-scrape/libsitehtml/'+newdoc, 'w')
file.write(str(newsoup))
file.close()
new = open('/home/ian/PythonPrograms/job-scrape/libsitehtml/'+newdoc)
new = new.read()
for olddoc in olddocs:
if os.path.isfile('/home/ian/Pythonprograms/job-scrape/libsitehtml/'+olddoc) == False:
createold = open('/home/ian/PythonPrograms/job-scrape/libsitehtml/'+olddoc, 'w')
old = open('/home/ian/PythonPrograms/job-scrape/libsitehtml/'+olddoc)
old = old.read()
if str(old) != str(new):
file = open('/home/ian/PythonPrograms/job-scrape/libsitehtml/'+olddoc, 'w')
file.write(str(new))
file.close()
server = smtplib.SMTP('smtp.gmail.com', 587)
server.ehlo()
server.starttls()
server.login('dummyemail', 'password')
server.sendmail('noreply.job.updates.com', 'myemail', 'Subject: A library\'s jobs page has changed\n' '\n' + 'Here\'s the URL:' + str(url))
server.quit()
elif str(old) == str(new):
pass
最佳答案
您的代码存在一些问题。主要问题是每个循环都运行到完成,使您只能有效地检查最后一个站点。您需要对每组 abbv
、url
和 bstag
运行比较。为此,有一个很好理解的 Python 函数,名为 zip()
,它很容易理解。
此外,您不需要存储新抓取的数据,因为它可以直接与旧数据进行比较(然后仅在发生更改时进行更新)。经过这些更改,您的代码可能如下所示:
import requests
import smtplib
import bs4
import os
abbvs = ['MCL', 'PFL', 'OPPL', 'FCPL', 'AnyPL', 'NOLS', 'VanWaPL', 'SLCPL', 'ProPL', 'ArapPL']
openurls = open('/home/ian/PythonPrograms/job-scrape/urls', 'r')
urls = openurls.read().strip('\n').split(',')
bstags = ['#content', '.col-md-12', '#main', '#containedInVSplit', '.col-sm-7', '.statement-left-div', '#main', '#main', '#componentBox', '.list-group.job-listings']
for abbv, url, bstag in zip(abbvs, urls, bstags):
res = requests.get(url)
res.raise_for_status()
olddoc = 'old'+abbv
currentsoup = bs4.BeautifulSoup(res.text, "lxml")
newsoup = str(currentsoup.select(bstag))
filepath = '/home/ian/Pythonprograms/job-scrape/libsitehtml/'+olddoc
if os.path.isfile(filepath):
with open(filepath) as old:
oldsoup = old.read()
else:
oldsoup = ''
if newsoup != oldsoup:
with open(filepath, 'w') as new:
new.write(newsoup)
server = smtplib.SMTP('smtp.gmail.com', 587)
server.ehlo()
server.starttls()
server.login('dummyemail', 'password')
server.sendmail('noreply.job.updates.com', 'myemail', 'Subject: A library\'s jobs page has changed\n' '\n' + 'Here\'s the URL:' + str(url))
server.quit()
不过,我尚未测试上述内容,因此它可能包含一些错误。但这应该是一个开始的事情。此外,您应该考虑尝试创建一个以 abbvs
作为键、urls
作为值的 dict
,因为它们紧密相连。
关于python - 尝试编写文本文件并将其与抓取的文本进行比较,但不太有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45068080/
在我们的服务出现一些预期的增长之后,突然间一些更新花费了非常长的时间,这些过去非常快,直到表达到大约 2MM 记录,现在它们每个需要大约 40-60 秒。 update table1 set fiel
我在服务中实现了一个传感器事件监听器,只要采样周期和最大报告延迟低于 1 秒,该监听器就可以正常工作,但一旦我将采样周期增加到超过 1 秒,传感器就根本不会更新。 我希望采样周期为 10 秒(可能是
我使用 Tkinter GUI 来启动测量和分析过程,基本上只需单击一个按钮即可开始。由于这些测量可能需要一段时间,我尝试添加一个进度条,即这个: http://tkinter.unpythonic.
我正在尝试使用套接字发送数据包,但出现错误。 invalid conversion from ‘omnetpp::cPacket*’ to ‘inet::Packet*’ [-fpermissive]
我刚刚发现 String#split 有以下奇怪的行为: "a\tb c\nd".split => ["a", "b", "c", "d"] "a\tb c\nd".split(' ') => ["a
您好,我正在尝试 ClojureScript,我正在使用 Klipse作为我的 REPL 差不多。这可能不是它的预期用途,但因为我没有做任何太复杂的事情,所以现在没问题。 我遇到的一个问题是尝试设置计
根据下面的数据,ClockKit 会生成一次 future 的 CLKComplicationTimelineEntry 项,但对于过去的时间点,会进行 24 次调用!这是为什么? 更多详情: 我注意
我有一个 MySQL 表,这个表有一个名为 datetime_utc 的 DATETIME 列。如您所料,它是 UTC 日期和时间。在我的 Bookshelf 模型中,我定义了一个虚拟 getter,
大家好,我是二哥呀! 昨天,一位球友问我能不能给他解释一下 @SpringBootApplication 注解是什么意思,还有 Spring Boot 的运行原理,于是我就带着他扒拉了一下这个注解的源
我是一名优秀的程序员,十分优秀!