这是我第一次在这写博客,还是有点兴奋。
我也是刚接触Python不久,发现Python代码真的很强大,简单就可以处理复杂的事。最近很想写个爬虫,但水平没达到,正好CSDN学院有个公开课,黄勇老师讲的《90分钟掌握Python多线程爬虫(全程实战)》,3月6日晚20:00我听了直播,当时没跟上,等看了回播才搞明白(可能我是Python2课里是Python3,找理由O(∩_∩)O哈哈~)。
先上笔记:
爬虫的流程分析:
1、请求数据:requests库(这个库可以很方便的去请求网络数据) *安装方法:pip install requests2、将请求下来的数据解析出来,获取我们想要的数据,把不想要的数据抛弃掉 *Beautifulsoup:pip install bs4 *lxml:pip install lxml3、将解析后的数据保存下来,如果是文字类型,可以保存到文件中或者数据库中或者缓存中,如果是文件类型,比如图片、视频,那么可以保存到硬盘中4、无论你的爬虫是大还是小,都是由这几个模块组成的。
在此感谢黄勇老师,也不啰嗦了,直接上代码。
#coding:utf-8 import requests import os from bs4 import BeautifulSoup import urllib import threading # 首先要进行身份伪装 Headers = {‘User-Agent‘: ‘Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Mobile Safari/537.36‘} PAGE_URLS=[] IMG_URLS=[]#全局变量IMG_URLS:就是一个列表,这个列表存储了很多表情包的链接 gLock=threading.Lock() def producer(): ‘‘‘生产者:专门用来从网站获取表情包的url链接,相当于增加IMG_URLS中的数据‘‘‘ while True: gLock.acquire()#多线程对全局变量操作必须加锁 if len(PAGE_URLS)==0: gLock.release()#跳出循环退出程序前也必须解锁 break page_url=PAGE_URLS.pop()#pop函数将列表中最后一项删除,并返回删除的项 gLock.release()#操作完成记得解锁 response = requests.get(page_url, Headers)#获取网页数据,返回response text = response.text # print text soup = BeautifulSoup(text, ‘lxml‘)#实例BeautifulSoup对象解析数据,使用lxml引擎。当然还可以用其他解析工具,也可用正则表达式,正则表达式比较复杂 img_list = soup.find_all("img", attrs={"class": "img-responsive lazy image_dta"})#根据标签属性查找自己想要的数据,抛弃其它非表情包图片 for img in img_list: img_url = img[‘data-original‘]#找到图片源网址,img[‘src‘]不是真正的图片源,网址都是一样 gLock.acquire() IMG_URLS.append(img_url) gLock.release() def consumer(): ‘‘‘消费者:专门从表情包的url链接中下载图片,相当于消耗IMG_URLS中的数据‘‘‘ while True: gLock.acquire() if len(IMG_URLS)==0 and len(PAGE_URLS)==0:#刚运行有可能IMG_URLS为空,所以加上PAGE_URLS同时为空才是结束条件 gLock.release() break if len(IMG_URLS)>0: img_url=IMG_URLS.pop()#为空时pop出错 else: img_url=‘‘ gLock.release() if img_url: filename = img_url.split("/")[-1]#将图片地址分割成列表,取最后一项文件名 fullpath = os.path.join("images", filename)#将images目录名与文件名合并,由于系统不同,不一定就是加"/" try: urllib.urlretrieve(img_url, fullpath)#urlretrieve函数就是从目标网址下载存储到本地,Python3中在request库中 # print img_url,"下载完成" except Exception as e: print e print img_url,"下载失败"#还时常出现10054错误,可能是服务器发现了爬虫强行关闭当前链接 def main(): for x in range(1,100):#爬取1-99页数据 page_url="https://www.doutula.com/photo/list/?page="+str(x) PAGE_URLS.append(page_url) for x in range(5):#开启5个生产者线程 th=threading.Thread(target=producer) th.start() for x in range(5):#开启5个消费者线程 th =threading.Thread(target=consumer) th.start() if __name__ == ‘__main__‘:#如果作为程序则执行,如果作为包加载则不执行 main()
原文地址:https://www.cnblogs.com/hua1121/p/10509846.html
时间: 2024-10-08 10:07:38