Ein großes Unternehmen hat mich gebeten, JD.com zu crawlen, um die Preisinformationen relevanter Branchenhändler zu vergleichen, um ihre Produktpositionierung und die Überwachung der öffentlichen Meinung in Zukunft zu erleichtern. Sie haben mich gebeten, eine allgemeine Crawler-Vorlage zu schreiben, um technische Anpassungen und Modifikationen auf ihrer Seite zu erleichtern , also habe ich es mitgebracht. Mit diesem Problem im Hinterkopf habe ich ihnen einige Vorschläge gemacht.
Zunächst müssen Sie die erforderlichen Bibliotheken installieren, einschließlich HTTP-Bibliothek, JSON-Bibliothek, Crawler-Bibliothek, Proxy-Bibliothek und Visualisierungsbibliothek. Es kann mit dem folgenden Befehl installiert werden:
cabal update
cabal install curl http-conduit bytestring quickcheck aeson json-conduit parsec
Als Nächstes müssen Sie eine Funktion erstellen, die eine URL annimmt und eine Liste aller Webseiten für diese URL zurückgibt. Diese Funktion kann die HTTP-Bibliothek zum Senden von GET-Anfragen verwenden.
import Network.HTTP.Conduit
import Network.HTTP.Request
getUrls :: String -> IO [String]
getUrls url = do
response <- liftIO (request HTTPMethodGet (uri url))
(获取ip:url:http://jshk.com.cn/mb/reg.asp?kefu=xjy&csdn)
case response of
Left (Status code _) -> error $ "Error: " ++ show code
Right response -> case response status of
OK -> do
let headers = responseBody response ^. headers
let content = responseBody response ^. content
return $ map decodeUtf8 $ headers HTTPHeaderLocation : tail content
_ -> error $ "Error: " ++ show response status
Anschließend müssen Sie eine Funktion erstellen, die eine Liste von URLs übernimmt und eine Liste mit dem gesamten Seiteninhalt zurückgibt.
import Data.List (intercalate)
getAllUrls :: [String] -> IO [String]
getAllUrls urls = do
let tasks = urls >>= getUrls
results <- parMapM getUrls tasks
return $ intercalate "\n" results
Als Nächstes müssen Sie eine Funktion erstellen, die eine Liste von URLs übernimmt und diese mithilfe eines Proxyservers crawlt.
import Network.HTTP.Proxy
getUrlsWithProxy :: String -> IO [String]
getUrlsWithProxy url = do
response <- liftIO $ requestWithProxy (ProxyHost "www.duoip.cn" 8000) HTTPMethodGet (uri url)
case response of
Left (Status code _) -> error $ "Error: " ++ show code
Right response -> case response status of
OK -> do
let headers = responseBody response ^. headers
let content = responseBody response ^. content
return $ map decodeUtf8 $ headers HTTPHeaderLocation : tail content
_ -> error $ "Error: " ++ show response status
Anschließend müssen Sie eine Funktion erstellen, die eine Liste von URLs übernimmt und einen Proxyserver verwendet, um diese URLs zu crawlen und eine Liste mit dem gesamten Seiteninhalt zurückzugeben.
import Data.List (intercalate)
getAllUrlsWithProxy :: [String] -> IO [String]
getAllUrlsWithProxy urls = do
let tasks = urls >>= getUrlsWithProxy
results <- parMapM getUrlsWithProxy tasks
return $ intercalate "\n" results
Schließlich müssen Sie eine Funktion erstellen, die eine Liste von URLs verwendet und einen Proxyserver verwendet, um diese URLs zu crawlen und den gesamten Seiteninhalt in eine Datei zu schreiben.
import System.IO (writeFile)
writeFileWithProxy :: String -> [String] -> IO ()
writeFileWithProxy filename urls = do
content <- liftIO $ getAllUrlsWithProxy urls
writeFile filename content
Das Obige ist der gesamte Inhalt der Verwendung von Haskell zum Schreiben eines Multithread-Crawler-Programms zum Crawlen von JD-Produkten und zur Durchführung einer visuellen Verarbeitung. Sie können dieses Programm an Ihre Bedürfnisse anpassen und verbessern.
Das Obige ist ein in Haskell geschriebenes Crawler-Programm, das viele Stellen enthält, die entsprechend den Anforderungen des Unternehmens geändert und hinzugefügt werden können. Hierbei ist zu beachten, dass Sie auf das Anti-Crawler-Problem der Website und auch auf die Unterstützung der Proxy-IP achten müssen. Wenn Sie weitere Fragen haben, können Sie im Kommentarbereich eine Nachricht hinterlassen und wir werden diese gemeinsam besprechen.