4

私は自分の学校で詐欺メールを比較したいプロジェクトを行っています。私はこのウェブサイトを見つけました:http ://www.419scam.org/emails/ 今私がしたいのは、すべての詐欺を別々の文書に保存し、後でそれらを分析することです。これまでの私のコードは次のとおりです。

import BeautifulSoup, urllib2

address='http://www.419scam.org/emails/'
html = urllib2.urlopen(address).read()
f = open('test.txt', 'wb')
f.write(html)
f.close()

これにより、htmlファイル全体がテキスト形式で保存されます。次に、ファイルを削除して、詐欺へのhtmlリンクのコンテンツを保存します。

<a href="2011-12/01/index.htm">01</a> 
<a href="2011-12/02/index.htm">02</a> 
<a href="2011-12/03/index.htm">03</a>

それがわかった場合でも、さらに一歩進んで、別のhrefを保存して開く必要があります。1つのPythonコードでそれをどのように行うのですか?

ありがとうございました!

4

5 に答える 5

5

BeautifulSoup で適切なツールを選択しました。技術的には、すべてを 1 つのスクリプトで実行することもできますが、分割することをお勧めします。これは、何万通もの電子メールを処理することになると思われるためです。これらはすべて個別の要求です。その間。

このページは非常に役に立ちますが、ここでは簡単なコード スニペットを紹介します。これは、電子メールのインデックス ページであるすべての html タグを取得し、それらの href リンクを抽出して、直接アクセスできるように URL の前に少し追加します。

from bs4 import BeautifulSoup
import re
import urllib2
soup = BeautifulSoup(urllib2.urlopen("http://www.419scam.org/emails/"))
tags = soup.find_all(href=re.compile("20......../index\.htm")
links = []
for t in tags:
    links.append("http://www.419scam.org/emails/" + t['href'])

「re」は Python の正規表現モジュールです。5 行目で、スープ内で href 属性がその正規表現に一致するすべてのタグを見つけるように BeautifulSoup に指示しました。この正規表現を選択したのは、そのページのすべての href リンクではなく、電子メールのインデックス ページのみを取得するためです。インデックス ページのリンクには、すべての URL でそのパターンがあることに気付きました。

適切な「a」タグをすべて取得したら、それらをループ処理し、t['href'] を実行して href 属性から文字列を抽出し、残りの URL を文字列の前に追加して、生の文字列 URL を取得しました。

そのドキュメントを読むと、これらの手法を拡張して個々の電子メールを取得する方法を理解できるはずです。

于 2012-06-04T18:40:23.143 に答える
3

requestslxml.htmlにも価値があるかもしれません。リクエストは http リクエストを作成するもう 1 つの方法であり、lxml は xml および html コンテンツを解析するための代替手段です。

HTML ドキュメントを検索する方法はたくさんありますが、cssselectから始めることをお勧めします。

import requests
from lxml.html import fromstring

url = 'http://www.419scam.org/emails/'
doc = fromstring(requests.get(url).content)

atags = doc.cssselect('a')

# using .get('href', '') syntax because not all a tags will have an href
hrefs = (a.attrib.get('href', '') for a in atags)

または、を使用してコメントで提案されているように.iterlinks()。「a」タグのみが必要な場合でも、フィルタリングする必要があることに注意してください。いずれにせよ、.make_links_absolute() 呼び出しがおそらく役立つでしょう。宿題ですので、遊んでみてください。

doc.make_links_absolute(base_url=url)

hrefs = (l[2] for l in doc.iterlinks() if l[0].tag == 'a')

次は、個々のスパム リンクをすべてループして開く方法です。

于 2012-06-04T18:35:56.707 に答える
2

ページ上のすべてのリンクを取得するには、BeautifulSoupを使用できます。このページを見てください、それは助けることができます。それは実際にあなたが必要なことを正確に行う方法を教えてくれます。

すべてのページを保存するには、現在のコードで行うのと同じことを行うことができますが、抽出してリストに保存するすべてのリンクを反復処理するループ内で行うことができます。

于 2012-06-04T18:08:56.457 に答える
2

HTML パーサーを使用して、検索するオブジェクトのタイプを指定できます。

from HTMLParser import HTMLParser
import urllib2

class MyHTMLParser(HTMLParser):
    def handle_starttag(self, tag, attrs):
        if tag == 'a':
            for attr in attrs:
                if attr[0] == 'href':
                    print attr[1]

address='http://www.419scam.org/emails/'
html = urllib2.urlopen(address).read()
f = open('test.txt', 'wb')
f.write(html)
f.close()

parser = MyHTMLParser()
parser.feed(html)
于 2012-06-04T18:45:17.887 に答える
2

lxml+XPathとを使用したソリューションを次に示しますurllib2

#!/usr/bin/env python2 -u
# -*- coding: utf8 -*-

import cookielib, urllib2
from lxml import etree

cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
page = opener.open("http://www.419scam.org/emails/")
page.addheaders = [('User-agent', 'Mozilla/5.0')]
reddit = etree.HTML(page.read())

# XPath expression : we get all links under body/p[2] containing *.htm
for node in reddit.xpath('/html/body/p[2]/a[contains(@href,".htm")]'):
    for i in node.items():
        url  = 'http://www.419scam.org/emails/' + i[1]
        page = opener.open(url)
        page.addheaders = [('User-agent', 'Mozilla/5.0')]

        lst = url.split('/')
        try:
            if lst[6]: # else it's a "month" link
                filename = '/tmp/' + url.split('/')[4] + '-' + url.split('/')[5]
                f = open(filename, 'w')
                f.write(page.read())
                f.close()
        except:
            pass

# vim:ts=4:sw=4
于 2012-06-04T18:48:10.887 に答える