Multithread-Crawler erfasst den Betriebsprozess von JD.com – große Unternehmen beeilen sich, an den Code zu kommen

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.

Fügen Sie hier eine Bildbeschreibung ein

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))
  (获取ipurlhttp://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.

Je suppose que tu aimes

Origine blog.csdn.net/weixin_44617651/article/details/134946522
conseillé
Classement