Tools
首页
画图
音乐
采集
记事
博客
实验室
登录
lypeng
146
文章
11
分类
46
记事
分类
生活-[23]
Linux-[24]
前端-[9]
数据库-[16]
PHP-[31]
git-[7]
其他-[6]
python-[20]
算法-[4]
React-Native-[4]
中草药-[2]
广告位1
广告位2
首页
/ python
返回列表
python案例(二) 爬虫入门
阅读:712
发布:2018-05-08
作者:lypeng
## 爬虫的流程 流程基本上都是互通的 1. 思考爬什么(图片、新闻文章、招聘数据、租房数据、电影评论、一些统计数据、甚至整站,一个搜索引擎) 2. 发送请求 (推荐requests模块,方便实用) 3. 分析处理,得到内容 (一般用到正则,HTML解析) 4. 保存获取的数据 (数据库相关,或者保存到文件) 5. 处理保存的数据(例如对于文章可以做两个页面去展示,统计数据可以做个折线图) ## requests ``` # 请求方式有get/post/put/delete # 可以传入的参数有,url,headers,data,timeout,cookies # url = 'http://www.xxxxx.com/a/b/c' 字符串 # headers = {'User-Agent':'1','Host':'2'} 字典 # data = {'a':'1','b':'2'} 字典 # timeout = 3 #单位秒 整数 # cookies = {'name':'1','userid':'2'} 字典 # files = {'file': open('/path/a.xls', 'rb')} 可以使用put做上传,还没体验 一般下面两种请求: requests.get(url,headers,timeout) requests.post(url,headers,data,timeout) ``` ## 正则 re模块 result = re.findall('正则表达式','内容') 多进程与线程没具体尝试,之后体验过在说 ## 案例 参考:[Python 爬虫]煎蛋网 OOXX 妹子图爬虫 http://www.tendcode.com/article/jiandan-meizi-spider-2/?_blank 重点是分析处理,解析图片地址比较费事,怎么将js转换为Python代码,多线程与进程这一块,还不会,没有用到~ 这里抓一个页面做个测试: 放代码: ```python #!/usr/bin/python # -*- coding:utf-8 -*- import re import requests import os import hashlib #用到MD5 import base64 import datetime # 获取页面HTML代码 def get_content(url): # 这里将获取到的内容保存到一个TXT文本里面,只请求一次,重点是分析处理得到的HTML if os.path.exists('res.txt') != True: headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36', 'Host': 'jandan.net' } html = requests.get(url,headers=headers,timeout=1).text f = open('res.txt','wt',encoding='utf-8') f.write(html) f.close() else: f = open('res.txt','rt',encoding='utf-8') html = f.read() f.close() return html # 得到图片的hash码 def get_imgcode(html): # 获取图片后面的hash hashcon = re.findall(r'
(.+?)
',html) return hashcon # MD5与base64函数 def _md5(value): '''md5加密''' m = hashlib.md5() m.update(value.encode('utf-8')) return m.hexdigest() def _base64_decode(data): '''bash64解码,要注意原字符串长度报错问题''' missing_padding = 4 - len(data) % 4 if missing_padding: data += '=' * missing_padding return base64.b64decode(data) # 获取关键字符串 def get_r(js_url): js = requests.get(js_url).text _r = re.findall('c=[\w\d]+\(e,"(.*?)"\)', js)[0] return _r # 根据hash-code与随机串得到imgurl # 来自原JS函数改写,这里缩进不能用tab,需要用四个空格,否则报错 def get_imgurl(m, r): e = "DECODE" q = 4 r = _md5(r) o = _md5(r[0:0 + 16]) n = _md5(r[16:16 + 16]) l = m[0:q] c = o + _md5(o + l) m = m[q:] k = _base64_decode(m) h = list(range(256)) b = [ord(c[g % len(c)]) for g in range(256)] f = 0 for g in range(0, 256): f = (f + h[g] + b[g]) % 256 tmp = h[g] h[g] = h[f] h[f] = tmp t = "" p, f = 0, 0 for g in range(0, len(k)): p = (p + 1) % 256 f = (f + h[p]) % 256 tmp = h[p] h[p] = h[f] h[f] = tmp t += chr(k[g] ^ (h[(h[p] + h[f]) % 256])) t = t[26:] return t # 下载图片,图片的二进制内容写入文件 def load_img(imgurl, file): '''下载单张图片到制定的文件夹下''' name = imgurl.split('/')[-1] file = "{}\\{}".format(file,name) item = requests.get(imgurl).content with open(file,'wb') as f: f.write(item) print('{} is loaded'.format(name)) # 测试部分开始 html = get_content('http://jandan.net/ooxx/page-60') imgcode = get_imgcode(html) # print(imgcode[:3]) # 把hashcode与关键字符串传入get_imgurl看能否得到图片地址 # m = get_imgurl('6387hrK00lDzkpF3HRpvdcxLbFWzT0vFAmz4nApIQ80R5kQQoLToJfyJ7+QVEu3RrZBdUDLIlod3kcPsOqtbU0GWh01rNBcUJPrwybUE3rHWnEHRS0CDVg','zE4N6eHuAQP8vkQPb0wcuEcWnLzHYVhy') # print(m) #返回 //wx4.sinaimg.cn/mw600/0076BSS5ly1fr34stibf4j30p011ijxo.jpg js_url = re.findall('', html)[-1] _r = get_r('http:{}'.format(js_url)) # print(js_url) # print(_r) # 测试load_img函数能否下载图片 # img_url = 'http://wx4.sinaimg.cn/mw600/0076BSS5ly1fr34stibf4j30p011ijxo.jpg' # load_img(img_url,'e:\\pic') # for循环获取该页所有图片 for hash in imgcode: img_url = 'http:' + get_imgurl(hash, _r) load_img(img_url,'e:\\pic') ```
------本文结束
感谢阅读------
上一篇:
python案例(一) Awesome-Python-Web部署
下一篇:
python案例(三) 百度百科爬虫