import os; import urllib.request; import re; import threading;# 多线程 from urllib.error import URLError#接收异常's 模块 #获取网站的源码 class QsSpider: #init 初始化构造函数 .self本身 def __init__(self): self.user_agent='Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36' self.header = {'User-Agent':self.user_agent} self.url = 'http://www.qiubaichengren.net/%s.html' self.save_dir = './img' self.page_num = 20 #page num #获取网站源代码 def load_html(self,page): try: web_path = self.url % page request = urllib.request.Request(web_path,headers=self.header) with urllib.request.urlopen(request) as f: html_content = f.read().decode('gbk') #print(html_content) self.pick_pic(html_content) except URLError as e : print(e.reason) #异常原因 #download def sava_pic(self,img): save_path = self.save_dir + "/" +img.replace(':','@').replace('/','_') if not os.path.exists(self.save_dir): os.makedirs(self.save_dir) print(save_path) urllib.request.urlretrieve(img,save_path) #filter def pick_pic(self,html_content): patren = re.compile(r'src="(http:.*?.(?:jpg|png|gif))') pic_path_list = patren.findall(html_content) for i in pic_path_list: #print(i) self.sava_pic(str(i)) #mamy threading def start(self): for i in range(1,self.page_num): thread = threading.Thread(target=self.load_html,args=str(i)) thread.start() # main void spider = QsSpider() spider.start()
一、爬虫流程:
1、发起请求
使用http库向目标站点发起请求,即发送一个Request
Request包含:请求头、请求体等
Request模块缺陷:不能执行JS 和CSS 代码
2、获取响应内容
如果服务器能正常响应,则会得到一个Response
Response包含:html,json,图片,视频等
3、解析内容
解析html数据:正则表达式(RE模块),第三方解析库如Beautifulsoup,pyquery等
解析json数据:json模块
解析二进制数据:以wb的方式写入文件
4、保存数据
数据库(MySQL,Mongdb、Redis)
文件
二、响应Response
1、响应状态码
200:代表成功
301:代表跳转
404:文件不存在
403:无权限访问
502:服务器错误
三、http协议 请求与响应
Request:用户将自己的信息通过浏览器(socket client)发送给服务器(socket server)
Response:服务器接收请求,分析用户发来的请求信息,然后返回数据(返回的数据中可能包含其他链接,如:图片,js,css等)
ps:浏览器在接收Response后,会解析其内容来显示给用户,而爬虫程序在模拟浏览器发送请求然后接收Response后,是要提取其中的有用数据。
四、结果(福利)