失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 爬虫网易LOFTER图片(适用于类似网页 如百度贴吧 )

爬虫网易LOFTER图片(适用于类似网页 如百度贴吧 )

时间:2023-12-25 17:58:05

相关推荐

爬虫网易LOFTER图片(适用于类似网页 如百度贴吧 )

介绍:

网易有一个图片社交网站叫LOFTER (乐乎),网站中有大量的晒图,其中不乏有各种“美好”的图片,当然我指的是摄影师的作品。通过爬虫来爬取乐乎网站的图片,网站链接: / ,当然类似的这种网站结构都可以套用本文中的代码,只需在提取 规则上改动,如百度贴吧中的图片,壁纸图片网页。并且这些网站一般没有反爬虫机制,毕竟要考虑经济成本,本身就没哟什么数据价值的东西,索性随便爬吧。本例只是练习使用,并没有实际价值。

使用的库:

发送请求常用的两个库:urllib2和requests,requests库时基于urllib3实现。

通过lxml库来解析response:使用lxml前注意先确保html经过了utf-8解码,即code = html.decode('utf-8', 'ignore'),否则会出现解析出错情况。因为中文被编码成utf-8之后变成 '/u2541'之类的形式,lxml一遇到“/”就会认为其标签结束。因此还要导入urllib库进行Unicode转码。

网页提取特定数据的方式:

(1)使用正则表达式,缺点繁琐使用难度大,优点一旦把正则用6之后就可以在很多方面使用

(2)使用xpath,在浏览器中通过安装xpath插件,可以在浏览器中实验,然后在编码中实现。查找数据简单,直接可以根据网页标签和属性定位要提取的数据

(3)使用BeautifulSoup,同样是在爬虫中经常使用,安装并导入bs4库,可以指定网页标签,还可以根据css规则,使用css选择器进行提取。使用简单,但是效率较前两种低(这种比较只是相对之间的,在使用过程中几乎不影响效率)

效果和代码实现:

#!/usr/bin/env python# -*- coding:utf-8 -*-import urllibimport urllib2from lxml import etreeimport timeclass LofterSpider(object):def __init__(self):# 加入user_Agent模拟真实的浏览器访问,反爬的手段self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"}self.base_url = "/"self.begin_page = int(begin_page)self.end_page = int(end_page)def send_request(self, url):try:# 发送request请求,如果是post请求,需要加一个data参数,在浏览器检查-headers中,form-data参数,改成字典形式request = urllib2.Request(url, headers=self.headers)# 得到response网页response = urllib2.urlopen(request)return response.read()except Exception, err:print "[ERROR]: 请求发送失败..."def load_page(self, html):html_obj = etree.HTML(html)# 2. 通过xpath提取数据,如果当前结点取不到数据,就往上一级查找。link_list = html_obj.xpath("//div[@class='index']/ul/li/a/@href")# xpath得到的是一个所有符合条件的列表。这里得到的是每个网页中二层链接for link in link_list:html = self.send_request(link)self.load_image(html)def load_image(self, html):# 使用etree对象可以解析html/xml得到一个Elementetree对象html_obj = etree.HTML(html)link_list = html_obj.xpath("//a[@class='imgclasstag']/img/@src")for link in link_list:# 将链接切割后再拼接成字符串,作为图片命名li2 = link.split('/')li3 = ''.join(li2)data = self.send_request(link)self.write_image(data, li3)def write_image(self, data, filename):print "[INFO]: 正在保存" + filenamewith open("./Images/" + filename, "wb") as f:f.write(data)def start_work(self):for page in range(self.begin_page, self.end_page + 1):ti = int(time.time()*1000)keyword = {"pn" : page,"ti":ti}# 传递一个字典格式数据,转换成的参数形式kw_str = urllib.urlencode(keyword) full_url = self.base_url + "/?page=" + kw_str# 单任务html = self.send_request(full_url)self.load_page(html)if __name__ == "__main__":begin_page = raw_input("爬取的起始页:")end_page = raw_input("爬取的结束页:")lofter = LofterSpider()lofter.start_work()

本例只是一个对于基础入门爬虫的初学者练习常用库,可以将单任务改成多线程(threading),协程(gevent)提高爬取速度,使用爬虫框架scrapy就不需要考虑这些问题。所以框架是程序员提高效率节省时间的好东西,毕竟原生的东西什么都要自己写。爬虫是一个很有意思的东西,并不是只能爬个黄图,荡个数据这么简单,要学习的还有很多。

,转载说明出处!

如果觉得《爬虫网易LOFTER图片(适用于类似网页 如百度贴吧 )》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。