之前有个大公司找我,需要爬取京东有关行业商家的价格信息做对比,方便后期自己的产品定位以及舆情监控,让我写一个通用的爬虫模版,方便他们那边技术调整修改,于是带着这样的问题,我给了他们一些几点建议。
首先,你需要安装必要的库,包括 HTTP 库、JSON 库、爬虫库、代理库和可视化库。可以使用以下命令进行安装:
cabal update
cabal install curl http-conduit bytestring quickcheck aeson json-conduit parsec
接下来,你需要创建一个函数,该函数接收一个 URL,并返回一个包含该 URL 所有网页的列表。这个函数可以使用 HTTP 库来发送 GET 请求。
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)
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
然后,你需要创建一个函数,该函数接收一个 URL 列表,并返回一个包含所有页面内容的列表。
import Data.List (intercalate)
getAllUrls :: [String] -> IO [String]
getAllUrls urls = do
let tasks = urls >>= getUrls
results <- parMapM getUrls tasks
return $ intercalate "\n" results
接下来,你需要创建一个函数,该函数接收一个 URL 列表,并使用代理服务器爬取这些 URL。
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
然后,你需要创建一个函数,该函数接收一个 URL 列表,并使用代理服务器爬取这些 URL,并返回一个包含所有页面内容的列表。
import Data.List (intercalate)
getAllUrlsWithProxy :: [String] -> IO [String]
getAllUrlsWithProxy urls = do
let tasks = urls >>= getUrlsWithProxy
results <- parMapM getUrlsWithProxy tasks
return $ intercalate "\n" results
最后,你需要创建一个函数,该函数接收一个 URL 列表,并使用代理服务器爬取这些 URL,并将所有页面内容写入一个文件。
import System.IO (writeFile)
writeFileWithProxy :: String -> [String] -> IO ()
writeFileWithProxy filename urls = do
content <- liftIO $ getAllUrlsWithProxy urls
writeFile filename content
以上就是使用 Haskell 编写一个多线程爬取京东商品的爬虫程序,并做可视化处理的全部内容。你可以根据自己的需要修改和完善这个程序。
以上就是利用Haskell 编写的爬虫程序,里面有很多地方都可以根据公司需求修改添加的。这里需要注意的是,注意网站反爬虫问题,还需要注意代理IP的辅助。如果有更多的问题可以评论区留言咱们一起探讨。
标签:do,String,URL,爬虫,抓取,content,多线程,response,函数 From: https://blog.51cto.com/u_13488918/8785752