使用python的requests模块实现百思不得其姐抓取(多线程版)
今天要抓取的是百思不得姐,网址是‘http://www.budejie.com/’,先明确一下我们的步骤和使用的模块
def main():# 页码url的队列page_q = Queue(100)# 获取到内容的队列item_q = Queue(1000)# 图片的队列img_q = Queue(1000)url = 'http://www.budejie.com/{}'for i in range(1,50):page_q.put(url.format(i))for x in range(5):pr = Producer(page_q,item_q,img_q)pr.start()for x in range(5):co = Consumer(page_q,item_q,img_q)co.start()
在main函数中是我们的启动函数 创建了5个生产者,5个消费者,url通过format方法配合循环进行构造,构造完成就把它放入页面的url的队列中。
class Producer(threading.Thread):def __init__(self,page_q,item_q,img_q,*args,**kwargs):super(Producer, self).__init__(*args,**kwargs)self.page_q = page_qself.item_q = item_qself.img_q = img_qdef parse_url(self,url):response = requests.get(url,headers=headers)resp = response.content.decode()html=etree.HTML(resp)li_list=html.xpath("//div[@class='j-r-list']/ul/li")for li in li_list:item={}# 用户姓名username=li.xpath(".//div[@class='u-txt']/a/text()")# 文章标题title=li.xpath(".//div[@class='j-r-list-c-desc']/a/text()")# 图片的urlimg_url=li.xpath(".//div[@class='j-r-list-c-img']/a/img/@data-original")# 发布时间pub_date = li.xpath(".//div[@class='u-txt']/span/text()")# 点赞数up = li.xpath('.//div[@class="j-r-list-tool-l "]//li[1]/span/text()')down = li.xpath('.//div[@class="j-r-list-tool-l "]//li[2]/span/text()')# print(up)print(down)imgs_url = ''.join(img_url)self.img_q.put(imgs_url)item={'username': username,'title': title,'img_url': img_url,'pub_data':pub_date,'uo':up,'down':down,}self.item_q.put(item)def run(self):while True:if self.page_q.empty():breakurl = self.page_q.get()self.parse_url(url)
# coding=utf-8
import requests
from lxml import etree
import json
import threading
from queue import Queue
import os
headers ={"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36"}
lock = threading.Lock()
# 生产者
class Producer(threading.Thread):def __init__(self,page_q,item_q,img_q,*args,**kwargs):super(Producer, self).__init__(*args,**kwargs)self.page_q = page_qself.item_q = item_qself.img_q = img_qdef parse_url(self,url):response = requests.get(url,headers=headers)resp = response.content.decode()html=etree.HTML(resp)li_list=html.xpath("//div[@class='j-r-list']/ul/li")for li in li_list:item={}# 用户姓名username=li.xpath(".//div[@class='u-txt']/a/text()")# 文章标题title=li.xpath(".//div[@class='j-r-list-c-desc']/a/text()")# 图片的urlimg_url=li.xpath(".//div[@class='j-r-list-c-img']/a/img/@data-original")# 发布时间pub_date = li.xpath(".//div[@class='u-txt']/span/text()")# 点赞数up = li.xpath('.//div[@class="j-r-list-tool-l "]//li[1]/span/text()')down = li.xpath('.//div[@class="j-r-list-tool-l "]//li[2]/span/text()')# print(up)print(down)imgs_url = ''.join(img_url)self.img_q.put(imgs_url)item={'username': username,'title': title,'img_url': img_url,'pub_data':pub_date,'uo':up,'down':down,}self.item_q.put(item)def run(self):while True:if self.page_q.empty():breakurl = self.page_q.get()self.parse_url(url)# 消费者
class Consumer(threading.Thread):def __init__(self, page_q, item_q, img_q,*args, **kwargs):# 重写__init__方法 并调用父类的方法super(Consumer, self).__init__(*args, **kwargs)self.page_q=page_qself.item_q=item_qself.img_q = img_q# 保存用户的内容到json数据 以 a的方式追加def save_content(self,item,i):con_json=json.dumps(item, ensure_ascii=False, indent=2)with open('123.json', 'a', encoding='utf-8') as f:# 上锁 调用acquire方法lock.acquire()f.write(con_json)lock.release()print('-----------------保存成功%d------------------' % i)# 下载保存图片def save_img(self,img_url,item):# 保存图片res = requests.get(img_url,headers=headers)# 取文件后缀suffxi = os.path.splitext(img_url)[1]file_name =item.get('username')file_name = 'images3/'+''.join(file_name)+suffxiwith open(file_name ,'wb') as f:# 加锁lock.acquire()f.write(res.content)# 释放锁lock.release()# 主要逻辑处理def run(self):i = 0while True:if self.page_q.empty() and self.item_q.empty() and self.img_q.empty():breakitem = self.item_q.get()img_url = self.img_q.get()self.save_content(item,i)self.save_img(img_url,item)i+=1def main():# 页码url的队列page_q = Queue(100)# 获取到内容的队列item_q = Queue(1000)# 图片的队列img_q = Queue(1000)url = 'http://www.budejie.com/{}'for i in range(1,50):page_q.put(url.format(i))for x in range(5):pr = Producer(page_q,item_q,img_q)pr.start()for x in range(5):co = Consumer(page_q,item_q,img_q)co.start()if __name__ == '__main__':main()
使用python的requests模块实现百思不得其姐抓取(多线程版)相关推荐
- 关于python中requests模块导入问题-python中requests模块的使用方法
本文实例讲述了python中requests模块的使用方法.分享给大家供大家参考.具体分析如下: 在HTTP相关处理中使用python是不必要的麻烦,这包括urllib2模块以巨大的复杂性代价获取综合 ...
- python的requests模块功能_python中requests模块的使用方法
本文实例讲述了python中requests模块的使用方法.分享给大家供大家参考.具体分析如下: 在HTTP相关处理中使用python是不必要的麻烦,这包括urllib2模块以巨大的复杂性代价获取综合 ...
- python怎么爬取Linux作业,Python爬虫之使用Fiddler+Postman+Python的requests模块爬取各国国旗...
介绍 本篇博客将会介绍一个Python爬虫,用来爬取各个国家的国旗,主要的目标是为了展示如何在Python的requests模块中使用POST方法来爬取网页内容. 为了知道POST方法所需要传递的HT ...
- Python爬虫之使用Fiddler+Postman+Python的requests模块爬取各国国旗
介绍 本篇博客将会介绍一个Python爬虫,用来爬取各个国家的国旗,主要的目标是为了展示如何在Python的requests模块中使用POST方法来爬取网页内容. 为了知道POST方法所需要传 ...
- Python爬虫---requests模块的基本使用
Python爬虫-requests模块的基本使用 基础 什么是爬虫? 就是通过编写程序模拟浏览器上网,然后让其去互联网上爬取数据的过程. 爬虫的分类 通用爬虫 抓取互联网中的一整张页面数据 聚焦爬虫 ...
- python如何导入requests模块_浅谈python中requests模块导入的问题
浅谈python中requests模块导入的问题 今天使用Pycharm来抓取网页图片时候,要导入requests模块,但是在pycharm中import requests 时候报错. 原因: pyt ...
- 说说如何利用 Python 的 requests 模块,从网络下载电子小说
利用 Python 的 requests 模块可以很容易从网络下载电子小说,甚至可以处理 https 连接!首先必须先安装该模块. 通过命令行,运行 -> pip install request ...
- python实现食品推荐_通过Python语言实现美团美食商家数据抓取
首先,我们先来打开美团美食商家页面,来分析一下. 如上面所提供的URL即为美团美食商家页面.或者我们通过美团官网打开一个美团美食商家页面,打开步骤如下:1.打开浏览器,输入 即可打开美团北京首页 2. ...
- Python之 - 使用Scrapy建立一个网站抓取器,网站爬取Scrapy爬虫教程
Scrapy是一个用于爬行网站以及在数据挖掘.信息处理和历史档案等大量应用范围内抽取结构化数据的应用程序框架,广泛用于工业. 在本文中我们将建立一个从Hacker News爬取数据的爬虫,并将数据按我 ...
- python爬取app播放的视频,Python爬虫工程师必学——App数据抓取实战视频教程
爬虫分为几大方向,WEB网页数据抓取.APP数据抓取.软件系统数据抓取.本课程主要为同学讲解如何用python实现App数据抓取,课程从开发环境搭建,App爬虫必备利器详解,项目实战,到最后的多App ...
最新文章
- 推荐一个Android Studio很实用的插件android-butterknife-zelezny
- Python 学习笔记(3)对txt文件的读与写操作(上)
- uni app 调用网络打印机_前端工程师 | 原生小程序坑点:uni-app到底好用在哪里?...
- c# Application.DoEvents
- 一步一步的写出你自己的makefile文件
- python支持list类型吗_Python-不支持的操作数类型为%:“list”和“int”
- Win7 U盘安装Ubuntu16.04 双系统
- .Net Core控制台应用加载读取Json配置文件
- android sdk 文档导读之前传:初涉
- app架构师实践指南pdf,分享一些行业经验,看完这一篇你就懂了
- 龙芯3a5000下编译postgresql 14.3
- 斐讯dc1服务器什么时候修复,[4月1日更新!!]斐讯DC1插座自制固件接入ha
- Ubuntu常用软件安装与问题解决(持续更新)
- 武汉大学计算机学院李明,第一届全国SLAM技术论坛在浙江大学成功举办
- python基础(第九章)面向对象
- msm8909 关于能否分别控制充电电流和USB输出电流问题 (温度问题)
- 个人对爬虫框架的一些认知(四)
- 综合性实验:停车场管理程序
- STM32H7不完全填坑教程系列
- 搞搞电脑微信表情的破解(.dat转png or jpg)