利用Python写一个爬妹子的爬虫


Posted in Python onJune 08, 2018

前言

最近学完Python,写了几个爬虫练练手,网上的教程有很多,但是有的已经不能爬了,主要是网站经常改,可是爬虫还是有通用的思路的,即下载数据、解析数据、保存数据。下面一一来讲。

1.下载数据

首先打开要爬的网站,分析URL,每打开一个网页看URL有什么变化,有可能带上上个网页的某个数据,例如xxID之类,那么我们就需要在上一个页面分析HTML,找到对应的数据。如果网页源码找不到,可能是ajax异步加载,去xhr里去找。

 利用Python写一个爬妹子的爬虫

有的网站做了反爬的处理,可以添加User-Agent :判断浏览器

self.user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
# 初始化 headers
self.headers = {'User-Agent': self.user_agent}

如果不行,在Chrome上按F12分析请求头、请求体,看需不需要添加别的信息,例如有的网址添加了referer:记住当前网页的来源,那么我们在请求的时候就可以带上。按Ctrl + Shift + C,可以定位元素在HTML上的位置

动态网页

有一些网页是动态网页,我们得到网页的时候,数据还没请求到呢,当然什么都提取不出来,用Python 解决这个问题只有两种途径:直接从JavaScript 代码里采集内容,或者用Python 的第三方库运行JavaScript,直接采集你在浏览器里看到的页面。

1.找请求,看返回的内容,网页的内容可能就在这里。然后可以复制请求,复杂的网址中,有些乱七八糟的可以删除,有意义的部分保留。切记删除一小部分后先尝试能不能打开网页,如果成功再删减,直到不能删减。

2.Selenium:是一个强大的网络数据采集工具(但是速度慢),其最初是为网站自动化测试而开发的。近几年,它还被广泛用于获取精确的网站快照,因为它们可以直接运行在浏览器上。Selenium 库是一个在WebDriver 上调用的API。

WebDriver 有点儿像可以加载网站的浏览器,但是它也可以像BeautifulSoup对象一样用来查找页面元素,与页面上的元素进行交互(发送文本、点击等),以及执行其他动作来运行网络爬虫。

PhantomJS:是一个“无头”(headless)浏览器。它会把网站加载到内存并执行页面上的JavaScript,但是它不会向用户展示网页的图形界面。把Selenium和PhantomJS 结合在一起,就可以运行一个非常强大的网络爬虫了,可以处理cookie、JavaScript、header,以及任何你需要做的事情。

下载数据的模块有urllib、urllib2及Requests

Requests相比其他俩个的话,支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自 动确定响应内容的编码,支持国际化的 URL 和 POST 数据自动编码,而且api相对来说也简单,但是requests直接使用不能异步调用,速度慢。

html = requests.get(url, headers=headers) #没错,就是这么简单

urllib2以我爬取淘宝的妹子例子来说明: 

利用Python写一个爬妹子的爬虫

user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = {'User-Agent': user_agent}
# 注意:form data请求参数
params = 'q&viewFlag=A&sortType=default&searchStyle=&searchRegion=city%3A&searchFansNum=¤tPage=1&pageSize=100'
 
 
def getHome():
 url = 'https://mm.taobao.com/tstar/search/tstar_model.do?_input_charset=utf-8'
 req = urllib2.Request(url, headers=headers)
 # decode('utf - 8')解码 把其他编码转换成unicode编码
 # encode('gbk') 编码 把unicode编码转换成其他编码
 # ”gbk”.decode('gbk').encode('utf - 8')
 # unicode = 中文
 # gbk = 英文
 # utf - 8 = 日文
 # 英文一 > 中文一 > 日文,unicode相当于转化器
 html = urllib2.urlopen(req, data=params).read().decode('gbk').encode('utf-8')
 # json转对象
 peoples = json.loads(html)
 for i in peoples['data']['searchDOList']:
 #去下一个页面获取数据
 getUseInfo(i['userId'], i['realName'])

2.解析数据

解析数据也有很多方式,我只看了beautifulsoup和正则,这个例子是用正则来解析的

def getUseInfo(userId, realName):
 url = 'https://mm.taobao.com/self/aiShow.htm?userId=' + str(userId)
 req = urllib2.Request(url)
 html = urllib2.urlopen(req).read().decode('gbk').encode('utf-8')
 
 pattern = re.compile('<img.*?src=(.*?)/>', re.S)
 items = re.findall(pattern, html)
 x = 0
 for item in items:
 if re.match(r'.*(.jpg")$', item.strip()):
 tt = 'http:' + re.split('"', item.strip())[1]
 down_image(tt, x, realName)
 x = x + 1
 print('下载完毕')

正则表达式说明

match:匹配string 开头,成功返回Match object, 失败返回None,只匹配一个。

search:在string中进行搜索,成功返回Match object, 失败返回None, 只匹配一个。

findall:在string中查找所有 匹配成功的组, 即用括号括起来的部分。返回list对象,每个list item是由每个匹配的所有组组成的list。

     1).*? 是一个固定的搭配,.和*代表可以匹配任意无限多个字符,加上?表示使用非贪婪模式进行匹配,也就是我们会尽可能短地做匹配

     2)(.*?)代表一个分组,如果有5个(.*?)就说明匹配了五个分组

     3) 正则表达式中,“.”的作用是匹配除“\n”以外的任何字符,也就是说,它是在一行中进行匹配。这里的“行”是以“\n”进行区分的。HTML标签每行的末尾有一个“\n”,不过它不可见。 如果不使用re.S参数,则只在每一行内进行匹配,如果一行没有,就换下一行重新开始,不会跨行。而使用re.S参数以后,正则表达式会将这个字符串作为一个整体,将“\n”当做一个普通的字符加入到这个字符串中,在整体中进行匹配。

3.保存数据

数据解析后可以保存到文件或数据库中,这个例子是保存到了文件中,很简单,就不做说明了,在下篇讲如何将数据保存到数据库

def down_image(url, filename, realName):
 req = urllib2.Request(url=url)
 folder = 'e:\\images\\%s' % realName
 if os.path.isdir(folder):
 pass
 else:
 os.makedirs(folder)
 
 f = folder + '\\%s.jpg' % filename
 if not os.path.isfile(f):
 print f
 binary_data = urllib2.urlopen(req).read()
 with open(f, 'wb') as temp_file:
 temp_file.write(binary_data)

GitHub地址,还有其他网站爬虫,欢迎star:https://github.com/peiniwan/CreeperTest (本地下载)

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
在Windows系统上搭建Nginx+Python+MySQL环境的教程
Dec 25 Python
python实现SMTP邮件发送功能
Jun 16 Python
Python sqlite3事务处理方法实例分析
Jun 19 Python
如何优雅地改进Django中的模板碎片缓存详解
Jul 04 Python
python五子棋游戏的设计与实现
Jun 18 Python
Python登录系统界面实现详解
Jun 25 Python
python分数表示方式和写法
Jun 26 Python
Python Pandas 获取列匹配特定值的行的索引问题
Jul 01 Python
详解Python打包分发工具setuptools
Aug 05 Python
python处理自动化任务之同时批量修改word里面的内容的方法
Aug 23 Python
解决pycharm不能自动补全第三方库的函数和属性问题
Mar 12 Python
解决Python字典查找报Keyerror的问题
May 26 Python
python os用法总结
Jun 08 #Python
Python DataFrame 设置输出不显示index(索引)值的方法
Jun 07 #Python
浅谈Pandas 排序之后索引的问题
Jun 07 #Python
pandas.dataframe中根据条件获取元素所在的位置方法(索引)
Jun 07 #Python
python pandas 对series和dataframe的重置索引reindex方法
Jun 07 #Python
浅谈Series和DataFrame中的sort_index方法
Jun 07 #Python
解决DataFrame排序sort的问题
Jun 07 #Python
You might like
php中配置文件操作 如config.php文件的读取修改等操作
2012/07/07 PHP
基于PHP编程注意事项的小结
2013/04/27 PHP
详解PHP内置访问资源的超时时间 time_out file_get_contents read_file
2013/06/03 PHP
ThinkPHP自动填充实现无限级分类的方法
2014/08/22 PHP
PHP curl 抓取AJAX异步内容示例
2014/09/09 PHP
php利用cookies实现购物车的方法
2014/12/10 PHP
Laravel Validator 实现两个或多个字段联合索引唯一
2019/05/08 PHP
用prototype实现的简单小巧的多级联动菜单
2007/03/24 Javascript
JS事件Event元素(兼容IE,Firefox,Chorme)
2012/11/01 Javascript
js向上无缝滚动,网站公告效果 具体代码
2013/11/18 Javascript
javascript检测是否联网的实现代码
2014/09/28 Javascript
javascript多物体运动实现方法分析
2016/01/08 Javascript
微信小程序 MINA文件结构
2016/10/17 Javascript
详解Angular2响应式表单
2017/06/14 Javascript
微信小程序实现点击按钮修改文字大小功能【附demo源码下载】
2017/12/06 Javascript
微信小程序-API接口安全详解
2019/07/16 Javascript
vue3.0中使用postcss-pxtorem的具体方法
2019/11/20 Javascript
[03:14]辉夜杯主赛事 12月25日每日之星
2015/12/26 DOTA
跟老齐学Python之用while来循环
2014/10/02 Python
python spyder中读取txt为图片的方法
2018/04/27 Python
解决python3 网络请求路径包含中文的问题
2018/05/10 Python
Python Scapy随心所欲研究TCP协议栈
2018/11/20 Python
Django JWT Token RestfulAPI用户认证详解
2019/01/23 Python
Python3.5 + sklearn利用SVM自动识别字母验证码方法示例
2019/05/10 Python
python通过robert、sobel、Laplace算子实现图像边缘提取详解
2019/08/21 Python
python并发爬虫实用工具tomorrow实用解析
2019/09/25 Python
html5的画布canvas——画出简单的矩形、三角形实例代码
2013/06/09 HTML / CSS
英国儿童图书网站:Scholastic
2017/03/26 全球购物
linux面试题参考答案(8)
2016/04/19 面试题
财务检查整改报告
2014/11/06 职场文书
学校艾滋病宣传活动总结
2015/05/09 职场文书
好人好事新闻稿
2015/07/17 职场文书
Python中使用ipython的详细教程
2021/06/22 Python
Django模型层实现多表关系创建和多表操作
2021/07/21 Python
开发者首先否认《遗弃》被取消的传言
2022/04/11 其他游戏
vue/cli 配置动态代理无需重启服务的方法
2022/05/20 Vue.js