有统计说一个网站的流量百分之八十都是由爬虫带走的。我感觉这个比例还是小了,只有用过爬虫才会知道爬虫的厉害。下面我将会介绍一种使用爬虫来爬取图片网站中的图片的方法。
首先,我们需要定义一个专门的类,在类外通过传入网址来进行爬取。
class GrilPhoto:pass
下面,我们分析一下这个类所需要的功能,然后设计出大致的结构。
我们需要生成动态的url,所以需要定义一个函数来拼接完整的url。
def make_url_list(self):"""生成url列表:return: 拼接后的完整url"""return [self.url_base.format(i) for i in range(1,10)]
我们需要定义一个函数返回目前访问的这个网站的源码内容。
def download_url(self,url_base):"""请求网站,返回网站的源码内容:param url_base: 网站url:return: 网站内容"""time.sleep(0.05)request = requests.get(url_base,proxies=self.proxies,headers=self.headers)#使用'.text'返回的是字符串类型,使用'.content'返回的是字节流,此处使用字符串类型return request.text
网站内容已经有了,那么接下来就是进行规则匹配了。
def parse_xpath(self,text):"""匹配函数:param text:网站内容:return:匹配到的内容(列表形式)"""html = lxml.html.fromstring(text)html_data = html.xpath('//body/div[2]/div[8]/ul/li/a/img/@src')print(html_data)return html_data
上步返回的就是每一张图片的完整路径,那么接下来我们只需要保存下载下来就可以了。
def save_photo(self,html_data,num_page):"""保存下载图片:param html_data:匹配到的内容:param num_page: 页码:return:"""for i in range(len(html_data)):time.sleep(0.05)req = requests.get(html_data[i],proxies=self.proxies,headers=self.headers)with open('D:/美女图片/第'+str(num_page)+'页-0'+ str(i) +'.jpg','wb') as f:f.write(req.content)
注意:我这里指定的保存路径是在D盘下的一个叫美女图片的文件夹中,当然,你也可以指定其他的文件夹,前提是这个文件夹存在(不存在当然要自己创建喽)。
最后一步,定义运行函数
def run(self):"""运行函数:return:"""list = self.make_url_list()for i in range(len(list)):text = self.download_url(list[i])data = self.parse_xpath(text)self.save_photo(data,i+1)
最后,附上整个程序的源码,在这个代码中我爬取的是美女图片,你也是可以指定其他网站的,不过,需要修改匹配规则,有兴趣的可以尝试尝试其他的网站。
import requests
import lxml.html
import timeclass GirlPhoto:def __init__(self):"""初始化对象"""#代理IPself.proxies = {"http":"http://39.137.69.6:80"}#请求头self.headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",}#爬取网址(待拼接)self.url_base = 'http://www.umei.cc/meinvtupian/{}.htm'def download_url(self,url_base):"""请求网站,返回网站的源码内容:param url_base: 网站url:return: 网站内容"""time.sleep(0.05)request = requests.get(url_base,proxies=self.proxies,headers=self.headers)#使用'.text'返回的是字符串类型,使用'.content'返回的是字节流,此处使用字符串类型return request.textdef make_url_list(self):"""生成url列表:return: 拼接后的完整url"""return [self.url_base.format(i) for i in range(1,10)]def parse_xpath(self,text):"""匹配函数:param text:网站内容:return:匹配到的内容(列表形式)"""html = lxml.html.fromstring(text)html_data = html.xpath('//body/div[2]/div[8]/ul/li/a/img/@src')print(html_data)return html_datadef save_photo(self,html_data,num_page):"""保存下载图片:param html_data:匹配到的内容:param num_page: 页码:return:"""for i in range(len(html_data)):time.sleep(0.05)req = requests.get(html_data[i],proxies=self.proxies,headers=self.headers)with open('D:/美女图片/第'+str(num_page)+'页-0'+ str(i) +'.jpg','wb') as f:f.write(req.content)def run(self):"""运行函数:return:"""list = self.make_url_list()for i in range(len(list)):text = self.download_url(list[i])data = self.parse_xpath(text)self.save_photo(data,i+1)girl = GirlPhoto()
girl.run()