学习python3爬虫,使用xpath 爬取糗事百科中段子的文章列表,使用单线程和多线程、队列两种方式

news/2024/10/30 15:21:01/

文章目录

    • 1、说明
    • 2、普通单线程代码
    • 3、使用多线程和队列的代码

在这里插入图片描述

1、说明

糗事百科中段子以文字为主, 爬取时,列表分两种情况

  • 内容很少,在列表中就能获取全部内容;
  • 内容较多,列表中只显示部分,点击 “查看全文”,在新页面中查看全部内容。

2、普通单线程代码

import  requests
from lxml import etree
import pprintclass QiubaiSpider:def __init__(self):self.url_temp="https://www.qiushibaike.com/text/page/{}/"self.headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"}def get_url_list(self):return [self.url_temp.format(i) for i in  range(1,14) ]def parse_url(self,url):response =requests.get(url,headers=self.headers)return response.content.decode()def get_content_list(self,html_str):# print(requests.utils.unquote(html_str))html = etree.HTML(html_str)div_list=html.xpath("//div[contains(@class,'col1')]/div[contains(@class,'article')]") # 分组item_list=[]for div in div_list:item={}#print("div============",etree.tostring(div))ccontent=div.xpath(".//div[@class='content']/span/text()")#print(ccontent)item["content"]='\n\n'.join(ccontent)if item["content"].find("查看全文")>1:suffix = div.xpath(".//a[@class='contentHerf']/@href")[0]url_tmp='{}{}'.format("https://www.qiushibaike.com",suffix)item["content"]=self.get_content_all(url_tmp)item["remark"]="========================拼接的======================"gender=div.xpath(".//div[contains(@class,'articleGender')]/@class")[0]item["gender"]=gender.split(" ")[-1].replace("Icon","") if len(gender) >0 else Noneitem_list.append(item)pprint.pprint(item_list)def get_content_all(self,url):html_str = self.parse_url(url)html = etree.HTML(html_str)content ='\n\n'.join( html.xpath("//div[@class='content']/text()"))return contentdef run(self):url_list=self.get_url_list()page=0for url in url_list:page=page+1print("-"*20,"第 ",page," 页","-"*20)html_str =self.parse_url(url)self.get_content_list(html_str)print("="*20,"结束,共 ",page," 页","="*20)if __name__=="__main__":qiubaiSpider=QiubaiSpider()qiubaiSpider.run()

3、使用多线程和队列的代码

在上面代码的基础上,优化程序,增加线程、队列,代码如下:

import  requests
from lxml import etree
import pprint
from queue import  Queue
import threadingclass QiubaiSpider:def __init__(self):self.url_temp="https://www.qiushibaike.com/text/page/{}/"self.headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"}self.url_queue = Queue()self.html_queue = Queue()self.content_queue = Queue()def get_url_list(self):print("get_url_list")for i in  range(1,14):self.url_queue.put(self.url_temp.format(i))def parse_url(self):print("parse_url")while True:url=self.url_queue.get()print(url)response =requests.get(url,headers=self.headers)self.html_queue.put(response.content.decode())self.url_queue.task_done()def get_content_list(self):print("get_content_list")while True:# print(requests.utils.unquote(html_str))html_str=self.html_queue.get()html = etree.HTML(html_str)div_list=html.xpath("//div[contains(@class,'col1')]/div[contains(@class,'article')]") # 分组item_list=[]for div in div_list:item={}#print("div============",etree.tostring(div))ccontent=div.xpath(".//div[@class='content']/span/text()")#print(ccontent)item["content"]='\n\n'.join(ccontent)if item["content"].find("查看全文")>1:suffix = div.xpath(".//a[@class='contentHerf']/@href")[0]url_tmp='{}{}'.format("https://www.qiushibaike.com",suffix)item["content"]=self.get_content_all(url_tmp)item["remark"]="========================拼接的======================"gender=div.xpath(".//div[contains(@class,'articleGender')]/@class")[0]item["gender"]=gender.split(" ")[-1].replace("Icon","") if len(gender) >0 else Noneitem_list.append(item)#pprint.pprint(item_list)self.content_queue.put(item_list)self.html_queue.task_done()def save_content(self):print("save_content")while True:content_list = self.content_queue.get()print(content_list)for i in content_list:print(i)self.content_queue.task_done()def get_content_all(self,url):response = requests.get(url, headers=self.headers)html_str= response.content.decode()html = etree.HTML(html_str)content ='\n\n'.join( html.xpath("//div[@class='content']/text()"))return contentdef run(self):thread_list=[]t_url= threading.Thread(target=self.get_url_list)thread_list.append(t_url)for i in range(10):t_parse = threading.Thread(target=self.parse_url)thread_list.append(t_parse)for i in range(5):t_content=threading.Thread(target=self.get_content_list)thread_list.append(t_content)t_save=threading.Thread(target=self.save_content)thread_list.append(t_save)for t in thread_list:t.setDaemon(True)t.start()for q in [self.url_queue,self.html_queue,self.content_queue]:q.join()print("主线程结束")if __name__=="__main__":qiubaiSpider=QiubaiSpider()qiubaiSpider.run()

http://www.ppmy.cn/news/155815.html

相关文章

笑话连篇(强)

和女同事的尴尬事秋实 4/10382007-2-6 弱智杀手zmm 12/23282004-11-9 夜半翻墙的10种死法 doughty 0/4592004-11-9 嫁给男工程师的10大好处飞雪 4/15512004-10-12 我的老公系列春花 7/7732004-10-8 (搞笑)经典!一些很彪悍的句子 !daluren 0/122007-…

窝布靠谱-58kaopu-窝布笑话-笑话大全-唯美图片-神回复

公仔:窝布 窝布靠谱: 是一个每天汇集网络新鲜资讯,主要包括文化生活,趣味搞笑,国内外趣闻,小清新美文等内容,给你一个轻松的阅读空间。【http://www.58kaopu.com/】笑话网提供各种笑话,有经典笑…

python多线程爬取段子_Python爬虫实例-多线程爬虫糗事百科搞笑内涵段子

学习爬虫,其乐无穷! 今天给大家带来一个爬虫案例,爬取糗事百科搞笑内涵段子。 爬取糗事百科段⼦,假设⻚⾯的 URL 是:http://www.qiushibaike.com/8h... 一、爬取要求:使⽤requests 获取⻚⾯信息&#xff0c…

RxJava+MVP架构笑话App实践

LiveShow https://github.com/GaoGersy/LiveShow 欢迎大家一起学习交流 使用聚合数据接口制作的一款集成了搞笑图片,笑话大全,微信精选,天气等的在线App 技术一览: 1.使用MVP架构,Fragment,Adapter都很好的抽取基…

Python爬虫之每天给她发一个笑话

寒假在家真是无聊透顶,天气又冷,整天只能躺在床上睡觉、玩游戏。出于好玩,偶然间看到一篇有趣的博客“python实现自动定时给女朋友发手机短信,每天一个笑话!” https://blog.csdn.net/qq_41841569/article/details/83…

Scrapy应用:爬取笑话网+Django构建应用

Part1:需求简要描述 1、抓取http://www.jokeji.cn网站的笑话 2、以瀑布流方式显示 Part2:安装爬虫框架Scrapy1.4 1、 安装Scrapy1.4 E:\django\myProject001>pip install scrapy 执行报错: error: Unable to find vcvarsall.bat …

2006年中国笑话大全

2006-11-29 18:36:44  南方都市报网络版 老幺 第10名:“人不能无耻到这样的地步!” 出场:陈凯歌 身份:导演 背景资料:“一个小小的馒头引发出一场惊天血案,本该是天真无邪的儿童却因为一件小事造成了人性扭曲……公安干警奉命抓捕犯罪嫌疑人……案情扑…

搞笑脑筋急转弯大全

刚看到一个笑话集锦,还不错,虽然有些大部分已经看过,但是还是决定转过来收藏下,也帮别人宣传和分享1 松下为什么没索尼强? 答案:panasonic (怕了索尼哥)2 A和C谁比较高呢&#xff1f…