首页 > 其他分享 >多线程爬虫抓取京东运行流程-大公司抢着要代码

多线程爬虫抓取京东运行流程-大公司抢着要代码

时间:2023-12-12 13:00:48浏览次数:23  
标签:do String URL 爬虫 抓取 content 多线程 response 函数

之前有个大公司找我,需要爬取京东有关行业商家的价格信息做对比,方便后期自己的产品定位以及舆情监控,让我写一个通用的爬虫模版,方便他们那边技术调整修改,于是带着这样的问题,我给了他们一些几点建议。

多线程爬虫抓取京东运行流程-大公司抢着要代码_Network

首先,你需要安装必要的库,包括 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

相关文章

  • Java多线程编程
    本文中简单介绍一些java多线程相关的内容1.多线程基础Java通过java.lang.Thread类和java.util.concurrent包提供了多线程支持。一个线程可以通过继承Thread类或实现Runnable接口来创建。classMyThreadextendsThread{publicvoidrun(){//线程执行的代码}......
  • py爬虫
    (1)请用requests库的get()函数访问如下一个网站20次,打印返回状态,text()内容,计算text()属性和content属性所返回网页内容的长度。importrequestsfrombs4importBeautifulSoupurl='https://baidu.com'foriinrange(20):try:r=requests.get(url)print(r......
  • 前端学习笔记202310学习笔记第一百壹拾玖天-模块包-内置模块http之爬虫3
    ......
  • Python爬虫获取校园课表(强制系统举例)
    Http:超文本传输协议Https:安全的http首先引入request库:pipinstallrequests 先F12打开页面检查,在network(网络)里面,然后刷新页面,会发先有个请求文档,点击并观察它:在常规里面可以看到请求地址为https://www.paisi.edu.cn:8181/jsxsd/?tdsourcetag=s_pcqq_aiomsg,将它复制到......
  • linux 多线程写同一个文件
    来自:https://blog.popkx.com/linux-multithreaded-programming-in-io-read-write-security-functions-pread-pwrite-and-read-write-what-is-the-difference-and-relat/ #include<unistd.h>ssize_tpread(intfd,void*buf,size_tcount,off_toffset);ssize_t......
  • 用Kotlin抓取微博数据并进行热度预测
    闲来无事,逛逛微博,看着每条热度很高的博文趣事,心想能否通过爬虫抓取微博热度并进行趋势分析,说干就干,这里需要注意的问题我会一一标注。爬虫ip信息的设置是在爬虫程序中进行的。爬虫ip信息可以帮助爬虫程序在访问目标网站时进行匿名化处理,以避免被目标网站检测到并封禁IP。以下是一......
  • 抓取真实浏览器设备指纹fingerprint写入cookie方案
     今天分享一个关于抓取真实浏览器设备指纹写入cookie方案,用户访问页面获取到用户设备生成指纹id,通过js把指纹存入cookie,然后用php进行获取cookie存的指纹值到后台。上写法: 首页在前端页面js引入:<!--引入浏览器指纹!--><script>functiongetCookie(name){varcook......
  • 第一次爬虫
    (2)请用requests库的get()函数访问如下一个网站20次,打印返回状态,text()内容,计算text()属性和content属性所返回网页内容的长度。python代码:importrequestsurl="https://www.so.com/"defgethtml(url):try:r=requests.get(url)r.raise_for_status()......
  • 爬虫
    importrequestsfrombs4importBeautifulSoupimportbs4defgetedhtml(url,code='utf-8'):kv={'user-agent':'Mozilla/5.0'}try:   r=requests.get(url,headers=kv,timeout=30)   r.raise_for_status()   r.encoding......
  • QtConcurrent::run()多线程的同步、异步
    Qt提供了QtConcurrent模块,处理一些常见的并行计算,最大的特点就是无需再使用互斥锁这种很低级的操作,全都封装好了。除此以外,QFuture、QFutureWatcher、QFutureSynchronizer类提供了一些辅助性的操作。参考:Qt中的多线程技术-知乎(zhihu.com)【QtConcurrent::run()需注意】......