本文共 5034 字,大约阅读时间需要 16 分钟。
下面分步骤几个小步骤来讲
特此声明 本人不足的地方还望指出 因为用到了几个模块所以要装一下 这里解析库用的是lxml所以要安装一下 pip install lxml pip isntall bs4 pip install requests1.获取响应
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/