博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
爬虫入门bs4之多线程
阅读量:3939 次
发布时间:2019-05-23

本文共 5034 字,大约阅读时间需要 16 分钟。

今天简单来讲一下爬虫解析库bs4还有一点多线程

下面分步骤几个小步骤来讲

特此声明 本人不足的地方还望指出
因为用到了几个模块所以要装一下
这里解析库用的是lxml所以要安装一下
pip install lxml
pip isntall bs4
pip install requests

1.获取响应

import requestsresposne  = requests.get('https://www.baidu.com/')print(resposne      )

如下图所示

在这里插入图片描述

这里是向服务器发起响应

对百度发起来一个请求等待服务器返回响应

结果是200表示请求成功

这里要了解一点http请求
比如常见的404就是表示页面请求失败

如果你请求过程失败了多半被服务器发现这个是一个爬虫而不是用户

所以要加上请求头就好了
f12刷新 netwwork 找到user就是请求头加上就行了
在这里插入图片描述
2.解析网页

import requestsfrom bs4 import BeautifulSoupheaders = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.13' '0 Safari/537.36'}url = 'https://www.baidu.com/'#定义请求头html = requests.get(url,headers=headers)#所使用bs4解析解析soup = BeautifulSoup(html.text,'lxml')print(soup)

下图是获取的网页数据

在这里插入图片描述
3,获取数据
接下来我们来获取网站信息结合上述进行演练
我们要获取这个网站的图片地址
我们来看一下怎么获取呢?
右键检查 看一下图片地址在哪
在这里插入图片描述
我们可以看到图片在

标签里
那就好办了
我们获取图片名称怎么办呢?
在这里插入图片描述

首页地址urls = 'http://www.crcz.com/touxiang/nv/list_'# print(urls)for x in range(1,3):    url = urls + str(x) + '.html' #拼接地址用于获取分页    # print(url)    # print(url)    html = requests.get(url,headers=headers)    html.encoding='utf-8'    soup = BeautifulSoup(html.text,'lxml')    #print(soup)    all_img = soup.select('.tx_list>ul>li')    # for all in all_img:   #图片地址    #     img = img_a.a.img.get('src')    #     print(img)    # 图片名称    # #     img_name = img_a.find('a', class_='txt').get_text()    # #     print(img_name)

4.下载数据

图片地址和图片名称的拿到了就好办了
下载呗

# 新建一个文件夹保存所有图片if not  os.path.exists('./tu/'):     os.mkdir('./tu/')      imgpath = './tu/' + img_name +'.jpg'         with open(imgpath,'wb') as f:              f.write(img)            print(img_name,'下载完成!!!')

5.完整代码

from bs4 import  BeautifulSoupimport  requestsimport os#请求头headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.13' '0 Safari/537.36'}urls = 'http://www.crcz.com/touxiang/nv/list_'# 新建一个文件夹保存所有图片if not os.path.exists('./tu/'): #如果没有当前文件夹则创建一个 os.mkdir('./tu/')#定义下载函数def get_url(page): for x in range(1,page+1): url = urls + str(x) + '.html'# 拼接url html = requests.get(url, headers=headers) html.encoding = 'utf-8' soup = BeautifulSoup(html.text, 'lxml') div_img = soup.select('.tx_list>ul>li') for img_a in div_img: # 图片名称 # img_name = img_a.find('a', class_='txt').get_text() # print(img_name) # 图片 img = img_a.a.img.get('src') # print(img) # 图片二进制 img_data = requests.get(url=img, headers=headers).content # print(img_data) # 图片名称 img_name = img_a.find('a', class_='txt').get_text() # print(img_name) # 图片存储路径 imgpath = './tu/' + img_name + '.jpg' with open(imgpath, 'wb') as f: f.write(img_data) print(img_name, '下载成功')if __name__ == '__main__': page = int(input('请输入需要爬取的页数:')) get_url(page)总结我们了解基本的流程了相信这一步步小节的拆分能帮助大家1好了解爬虫整个流程这里上面的是单线程如果我们爬去数据过多就会导致下载过慢这就要涉及进程问题单线程就是同好比如说一群人在排队必须要排对一个一个来等他结束所谓多线程就是需要多个玩成的任务几个人就可以玩成不必等待

单线程时间

在这里插入图片描述

多线程时间

在这里插入图片描述

多线程代码

import  requestsimport threadingimport timeimport queueimport osimport requestsfrom bs4 import BeautifulSoupheaders = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.13' '0 Safari/537.36'}#queeue线程url_queue = queue.Queue()#首页urls = 'http://www.crcz.com/touxiang/nv/list_'#定义下载函数def get_url(page): for x in range(1,page+1): url = urls + str(x) + '.html'# 拼接url print(url) # print(url) url_queue.put(url) # print(url_queue.queue)#定定义爬取函数def spider(url_queue): # 新建一个文件夹保存所有图片 if not os.path.exists('./tu1'): os.mkdir('./tu1') url = url_queue.get()# 从队列中取出最前面的url html = requests.get(url=url,headers=headers) html.encoding = 'utf-8' soup = BeautifulSoup(html.text,'lxml')# 对源码进行解析 div_img = soup.select('.tx_list>ul>li') for img_a in div_img: img = img_a.a.img.get('src') # 图片二进制 img_data = requests.get(url=img, headers=headers).content # 图片名称 img_name = img_a.find('a', class_='txt').get_text() # 图片存储路径 imgpath = './tu1/' + img_name + '.jpg' with open(imgpath, 'wb') as f: f.write(img_data) print(img_name, '下载成功') if not url_queue.empty(): spider(url_queue)def main(): queue_list = [] t = threading.Thread(target=spider, args=(url_queue,)) t.start() queue_list.append(t) for t in queue_list: t.join() print('线程完毕')if __name__ == '__main__': page = int(input('请输入需要爬取的页数:')) get_url(page) # start_time = time.time() ted = time.time() main() end = time.time() print(f'一共下载{end - ted}秒') # print("test3用时:%f" % (time.time() - start_time)) 多线程首先定义一个任务列表 来供进程来使用 然后调用任务进程添加到对列去执行 等待进来进程执行完毕 这里如果网络不好的进程就会堵塞导致网站请求过慢所以使用代码之前要保证1网络通畅 不然就是同步了比同步还慢

感谢大家点个赞在走吧

转载地址:http://poywi.baihongyu.com/

你可能感兴趣的文章
DataGridView分頁控件
查看>>
Linq 使用entity framework查询视图返回重复记录的问题(转)
查看>>
项目中得到执行文件版本或其它信息
查看>>
WinForm DatagridView绑定大量数据卡顿的问题
查看>>
DataGridView或 DataTable导出到excel
查看>>
Ilist To DataTable
查看>>
SQL @@IDENTITY, IDENT_CURRENT,SCOPE_IDENTITY
查看>>
簡單工廠模式
查看>>
c# 读写txt文件
查看>>
Javascript Json对象与字符串转换
查看>>
Entity Framework对数据库表的CRUD操作
查看>>
练手:Linq的循环
查看>>
c# 用委託 + 策略 解決 switch case 過多的問題
查看>>
BinaryFormatter 類別
查看>>
构造函数
查看>>
SQL Server 使用 FileStream存储图片文件等BLOB资料
查看>>
vs中 WebAPI 以Console application和WinForm作为宿主的部署
查看>>
Javascript常用日期获取方法
查看>>
SQL Server 将字符串按指定字符分隔后存储到table
查看>>
SQL Server的數據類型
查看>>