Python 使用regex加快2个循环,在网站上查找电子邮件地址

Python 使用regex加快2个循环,在网站上查找电子邮件地址,python,html,regex,loops,web,Python,Html,Regex,Loops,Web,我需要帮助找到网站上的电子邮件地址。经过一些研究,我找到了解决方案,但它太长了,我有很多数据(超过90000),我的代码从未停止过 你知道优化/加速我的代码的技巧吗 这是我的URL列表: http://etsgaidonsarl.site-solocal.com/ http://fr-fr.facebook.com/people/ http://ipm-mondia.com/ http://lfgenieclimatique.fr/ http://vpcinstallation.site-sol

我需要帮助找到网站上的电子邮件地址。经过一些研究,我找到了解决方案,但它太长了,我有很多数据(超过90000),我的代码从未停止过

你知道优化/加速我的代码的技巧吗

这是我的URL列表:

http://etsgaidonsarl.site-solocal.com/
http://fr-fr.facebook.com/people/
http://ipm-mondia.com/
http://lfgenieclimatique.fr/
http://vpcinstallation.site-solocal.com
http://www.cavifroid.fr/
http://www.clim-monnier.com/
http://www.climacool.net/


我使用两个循环。第一种方法是查找网站的所有页面,因为电子邮件地址并非每次都在第一页上。 在第二个循环中,我快速浏览页面以查找电子邮件地址,代码:

EMAIL_REGEX = r"""(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-zA-Z](?:[a-z0-9-]*[a-zA-Z])?\.)+[a-zA-Z](?:[a-z0-9-]*[a-zA-Z])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-zA-Z]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])"""
我觉得我的正则表达式太长了,这可能是个问题吗

session = HTMLSession()


mailing=[]
for index, i in enumerate(link): #link is the list of the URLs
    try:
        r = session.get(i)
        site=r.html.absolute_links
        linkslist = list(r.html.absolute_links)
    except:
        linkslist=list(i)
    for j in linkslist:
        try:
            r1 = session.get(j)
            for re_match in re.finditer(EMAIL_REGEX, r1.html.raw_html.decode()):
            mail=(re_match.group())
            liste=[index,mail,j]
            mailing.append(liste)
        except:
            pass

print(mailing)
df = pd.DataFrame(mailing, columns=['index1','mail','lien',])


感谢您的帮助

我认为多线程应该可以完成这项工作。您的正则表达式,我不知道它是做什么的,但是假设它工作并且有用,多线程版本应该如下所示。我测试了代码,它工作正常

`from threading import Thread, Lock
from requests_html import HTMLSession
import re
lock = Lock()
link = ["http://etsgaidonsarl.site-solocal.com/",
"http://fr-fr.facebook.com/people/",
"http://ipm-mondia.com/",
"http://lfgenieclimatique.fr/",
"http://vpcinstallation.site-solocal.com",
"http://www.cavifroid.fr/",
"http://www.clim-monnier.com/",
"http://www.climacool.net/"]
linklist = []
mailing = []
main_threads = []
minor_threads = []
EMAIL_REGEX = r"""(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-zA-Z](?:[a-z0-9-]*[a-zA-Z])?\.)+[a-zA-Z](?:[a-z0-9-]*[a-zA-Z])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-zA-Z]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])"""




def links_scraper(single_url):
    try:
        session = HTMLSession()
        r = session.get(single_url)
        site=r.html.absolute_links
        the_list = list(r.html.absolute_links)
        linklist.extend(list(zip([single_url for _ in range(len(the_list))], the_list)))
    except Exception as e:
        # print("Exception:", e)
        linklist.append((single_url, single_url))


def mail_scrapper(main_url, single_link):
    try:
        session = HTMLSession()
        r1 = session.get(single_link)
        for re_match in re.finditer(EMAIL_REGEX, r1.html.raw_html.decode()):
            mail=(re_match.group())
            liste=[link.index(main_url),mail,single_link]
            mailing.append(liste)
    except Exception as e:
        # print(f"Exception: {e}")
        pass

def main():
    for l in link:
        t = Thread(target=links_scraper, args=(l,))
        t.start()
        main_threads.append(t)

    while len(main_threads) > 0:
        try:
            with lock:
                current_link = linklist.pop(0)
            minor_thread = Thread(target=mail_scrapper, args=(current_link[0], current_link[1]))
            minor_threads.append(minor_thread)
            minor_thread.start()
        except IndexError:
            pass
        for t in main_threads:
            if t.isAlive() == False:
                main_threads.pop(main_threads.index(t))

    for t in minor_threads:
        t.join()

main()
print("Mailing:", mailing)`

我认为多线程应该可以完成这项工作。您的正则表达式,我不知道它是做什么的,但是假设它工作并且有用,多线程版本应该如下所示。我测试了代码,它工作正常

`from threading import Thread, Lock
from requests_html import HTMLSession
import re
lock = Lock()
link = ["http://etsgaidonsarl.site-solocal.com/",
"http://fr-fr.facebook.com/people/",
"http://ipm-mondia.com/",
"http://lfgenieclimatique.fr/",
"http://vpcinstallation.site-solocal.com",
"http://www.cavifroid.fr/",
"http://www.clim-monnier.com/",
"http://www.climacool.net/"]
linklist = []
mailing = []
main_threads = []
minor_threads = []
EMAIL_REGEX = r"""(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-zA-Z](?:[a-z0-9-]*[a-zA-Z])?\.)+[a-zA-Z](?:[a-z0-9-]*[a-zA-Z])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-zA-Z]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])"""




def links_scraper(single_url):
    try:
        session = HTMLSession()
        r = session.get(single_url)
        site=r.html.absolute_links
        the_list = list(r.html.absolute_links)
        linklist.extend(list(zip([single_url for _ in range(len(the_list))], the_list)))
    except Exception as e:
        # print("Exception:", e)
        linklist.append((single_url, single_url))


def mail_scrapper(main_url, single_link):
    try:
        session = HTMLSession()
        r1 = session.get(single_link)
        for re_match in re.finditer(EMAIL_REGEX, r1.html.raw_html.decode()):
            mail=(re_match.group())
            liste=[link.index(main_url),mail,single_link]
            mailing.append(liste)
    except Exception as e:
        # print(f"Exception: {e}")
        pass

def main():
    for l in link:
        t = Thread(target=links_scraper, args=(l,))
        t.start()
        main_threads.append(t)

    while len(main_threads) > 0:
        try:
            with lock:
                current_link = linklist.pop(0)
            minor_thread = Thread(target=mail_scrapper, args=(current_link[0], current_link[1]))
            minor_threads.append(minor_thread)
            minor_thread.start()
        except IndexError:
            pass
        for t in main_threads:
            if t.isAlive() == False:
                main_threads.pop(main_threads.index(t))

    for t in minor_threads:
        t.join()

main()
print("Mailing:", mailing)`

你的正则表达式为什么这么长?你能解释一下它的作用吗?(“如何使用Python从网站上刮取电子邮件地址?”)可能会有帮助。@SyKer我尝试了一些正则表达式,这是找到电子邮件的最好方法address@CarySwoveland感谢的这个链接,但这种情况下,只有该网站的网址是考虑到,而不是所有的网页的网站。我已经试过这个技术…为什么你的正则表达式这么长?你能解释一下它的作用吗?(“如何使用Python从网站上刮取电子邮件地址?”)可能会有帮助。@SyKer我尝试了一些正则表达式,这是找到电子邮件的最好方法address@CarySwoveland感谢的这个链接,但这种情况下,只有该网站的网址是考虑到,而不是所有的网页的网站。我已经尝试过这个技术…感谢@ShahidKhan的帮助!但是用你的代码,邮件列表最后是空的。。。我试图找到解决办法,但我无法…@ThéaGilles我不明白。我只是运行代码,它给出了一个非空的邮件列表。里面有邮件。你能重新检查你的代码吗?在我的链接列表中,链接不在“”之间,而在你的代码中有“”。你知道我怎样才能改变我的名单吗?谢谢again@ThéaGilles我不完全理解你的评论,但只要看看我的列表,你就会很好地找到解决方案,而且你的解决方案比我的快,非常感谢。只是一个问题:当我列出一个包含5000个元素的列表时,您的代码不会打印所有电子邮件。当我再次运行代码时,每次的结果都不一样。例如,我第一次从链接列表中的437个元素到1067个元素得到结果,当我再次运行代码时,我得到了从543个元素到1446个元素的结果。你能帮我吗?谢谢@ShahidKhan的帮助!但是用你的代码,邮件列表最后是空的。。。我试图找到解决办法,但我无法…@ThéaGilles我不明白。我只是运行代码,它给出了一个非空的邮件列表。里面有邮件。你能重新检查你的代码吗?在我的链接列表中,链接不在“”之间,而在你的代码中有“”。你知道我怎样才能改变我的名单吗?谢谢again@ThéaGilles我不完全理解你的评论,但只要看看我的列表,你就会很好地找到解决方案,而且你的解决方案比我的快,非常感谢。只是一个问题:当我列出一个包含5000个元素的列表时,您的代码不会打印所有电子邮件。当我再次运行代码时,每次的结果都不一样。例如,我第一次从链接列表中的437个元素到1067个元素得到结果,当我再次运行代码时,我得到了从543个元素到1446个元素的结果。你能帮助我吗?