当前位置: 首页 > 后端技术 > Python

Python爬虫实例-多线程爬虫囧事大全搞笑内涵笑话

时间:2023-03-26 12:39:35 Python

学习爬虫乐趣多多!今天给大家带来一个爬虫案例,爬取尴尬事百科全书的搞笑内涵段子。爬取囧事百科,假设页面的URL为:http://www.qiushibaike.com/8h...1、爬取要求:使用requests获取页面信息,使用XPath/re进行数据提取.获取每个帖子的用户头像链接、用户名、段落内容、点赞数和评论数。将其保存到一个json文件中。二、先来看看单线程序示例参考代码:#qiushibaike.py#importurllib#importre#importchardetimportrequestsfromlxmlimportetreepage=1url='http://www.qiushibaike.com/8hr/page/'+str(page)headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/52.0.2743.116Safari/537.36','Accept-Language':'zh-CN,zh;q=0.8'}try:response=requests.get(url,headers=headers)167resHtml=response.texthtml=etree.HTML(resHtml)result=html.xpath('//div[contains(@id,"qiushi_tag")]')forsiteinresult:item={}imgUrl=site.xpath('./div/a/img/@src')[0].encode('utf-8')用户名=site.xpath('./div/a/@title')[0].encode('utf-8')#username=site.xpath('.//h2')[0].textcontent=site.xpath('.//div[@class="content"]/span')[0].text.strip().encode('utf-8')#投票次数vote=site.xpath('.//i')[0].text#printsite.xpath('.//*[@class="number"]')[0].text#评论信息comments=site.xpath('.//i')[1].textprintimgUrl,用户名,内容,投票,commentsexceptException,e:printe演示效果:3.多线程案例Queue(队列对象):Queue是python中的一个标准库,可以直接导入Queue引用;queue是python下最常用的线程间交换数据的形式对线程资源的思考,锁是一个重要的环节,因为Python原生的list、dict等都不是线程安全的。而Queue是线程安全的,所以在满足使用条件的情况下还是推荐使用队列。初始化:类Queue.Queue(maxsize)FIFO先进先出包中常用方法:Queue.qsize()返回队列的大小Queue.empty()如果队列为空则返回True,否则返回FalseQueue.full()如果队列满则返回True,否则FalseQueue.full和maxsize对应Queue.get([block[,timeout]])获取队列,timeout等待时间创建一个“队列”对象importQueuemyqueue=Queue.Queue(maxsize=10)向队列中放入一个值myqueue.put(10)从队列中取出一个值myqueue.get()多线程示意图:如果需要全套python爬虫视频教程来自项目入门实战请点:爬虫视频教程。参考代码:#-*-coding:utf-8-*-importrequestsfromlxmlimportetreefromQueueimportQueueimportthreadingimporttimeimportjsonclassthread_crawl(threading.Thread):'''抓取线程类'''definit(self,threadID,q):threading.线程。init(self)self.threadID=threadIDself.q=qdefrun(self):print"Starting"+self.threadIDself.qiushi_spider()print"Exiting",self.threadIDdefqiushi_spider(self):#page=1whileTrue:ifself.q.empty():breakelse:page=self.q.get()print'qiushi_spider=',self.threadID,',page=',str(page)url='http://www.qiushibaike.com/hot/page/'+str(page)+'/'headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/52.0.2743.116Safari/537.36','Accept-Language':'zh-CN,zh;q=0.8'}#多次尝试失败绑定、防?死循环timeout=4whiletimeout>0:timeout-=1try:content=requests.get(url,headers=headers)data_queue.put(content.text)breakexcept异常,e:print'qiushi_spider',eiftimeout<0:print'timeout',urlclassThread_Parser(threading.Thread):'''页面解析类;'''definit(self,threadID,queue,lock,f):threading.Thread.init(self)self.threadID=threadIDself.queue=queueself.lock=lockself.f=fdefrun(self):print'开始',self.threadIDglobaltotal,exitFlag_ParserwhilenotexitFlag_Parser:try:'''调用队列对象的get()方法从队头删除并返回一个item可选参数为block,默认为True。如果队列为空且块为True,则get()会导致调用线程暂停,直到有可用项为止。otal如果队列为空且块为False,则队列将引发Empty异常。'''item=self.queue.get(False)ifnotitem:passself.parse_data(item)self.queue.task_done()print'Thread_Parser=',self.threadID,',total=',texcept:passprint'Exiting',self.threadIDdefparse_data(self,item):'''解析???数:paramitem:??内容:return:'''globaltotaltry:html=etree.HTML(item)result=html.xpath('//div[contains(@id,"qiushi_tag")]')forsiteinresult:try:imgUrl=site.xpath('.//img/@src')[0]title=site.xpath('.//h2')[0].textcontent=site.xpath('.//div[@class="content"]/span')[0].text.strip()vote=Nonecomments=Nonetry:vote=site.xpath('.//i')[0].textcomments=site.xpath('.//i')[1].textexcept:passresult={'imgUrl':imgUrl,'title':title,'content':内容,'vote':投票,'comments':评论,}withself.lock:#print'write%s'%json.dumps(result)self.f.write(json.dumps(result,ensure_ascii=False).encode('utf-8')+"\n")exceptException,e:print'结果中的站点',eexceptException,e:print'parse_data',ewithself.lock:total+=1data_queue=Queue()exitFlag_Parser=Falselock=threading.Lock()total=0defmain():output=open('qiushibaike.json','a')#从1-10页初始化网页代码页pageQueue=Queue(50)forpageinrange(1,11):pageQueue.put(page)#初始化收集线程crawlthreads=[]crawlList=["crawl-1","crawl-2","crawl-3"]forthreadIDincrawlList:thread=thread_crawl(threadID,pageQueue)thread.start()crawlthreads.append(thread)#初始化解析线程parserListparserthreads=[]parserList=["parser-1","parser-2","parser-3"]#启动parserListforthreadIDinparserList:thread=Thread_Parser(threadID,data_queue,lock,output)thread.start()parserthreads.append(thread)#等待清空队列不pageQueue.empty():pass#WaitforallThreadcompletedfortincrawlthreads:t.join()whilenotdata_queue.empty():pass#通知线程是时候退出全局了exitFlag_ParserexitFlag_Parser=Truefortinparserthreads:t.join()print"ExitingMain线程"与lock:output.close()ifname=='main':main()4.作业1.抓取笔趣网某小说的所有页面2、国家食品药品监督管理总局:http://app1.sfda.gov.cn对国产药(6994)商品名下的所有产品信息进行汇总分类。您可以尝试这样做。如果想要详细的爬虫视频讲解,请点击爬虫视频。