学习爬虫基础5-一个简单的小案例
来源:互联网 发布:洛带古城知乎 编辑:程序博客网 时间:2024/05/16 17:52
爬去百度贴吧中的html文档下来
会使用到urllib中的 urllib.urlencode() 方法来编码发送请求时候的 请求参数
URL编码转换:urllib的urlencode()
urllib 模块仅可以接受URL,不能创建 设置了headers 的Request 类实例;但是 urllib 提供 urlencode 方法用来产生GET查询字符串,而 urllib2 则没有。(这是 urllib 和 urllib2 经常一起使用的主要原因)编码工作使用urllib的urlencode()函数,帮我们将key:value这样的键值对,转换成"key=value"这样的字符串,解码工作可以使用urllib的unquote()函数。( 注意,不是urllib2.urlencode())
# IPython2 中的测试结果In [1]: import urllibIn [2]: word = {"wd" : "百度"}# 通过urllib.urlencode()方法,将字典键值对按URL编码转换,从而能被web服务器接受。In [3]: urllib.urlencode(word) Out[3]: "wd=%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2"# 通过urllib.unquote()方法,把 URL编码字符串,转换回原先字符串。In [4]: print urllib.unquote("wd=%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2")wd=百度
爬贴吧中的内容 代码演示
#!/usr/bin/env python# -*- coding: utf-8 -*-import urllibimport urllib2import osimport timedef get_request(url): """发起请求""" header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1'} request = urllib2.Request(url, headers=header) response = urllib2.urlopen(request, timeout=5) if response.getcode() == 200: html = response.read() return html else: print('请求失败....')def write_html(html, page): """爬取出来的内容写入到文件中""" if not os.path.exists('./贴吧'): os.mkdir('./贴吧') file_path = os.path.join('./贴吧', '贴吧的第' + str(page) + '内容.html') try: with open(file_path, 'w') as fp: fp.write(html) print('保存成功') except Exception as err: print(err)def spider(name, start_page, end_page): """爬虫主程序""" base_url = 'https://tieba.baidu.com/f?' keyword = {"kw": name} # 编码 keyword = urllib.urlencode(keyword) start_time = time.time() for page in range(start_page, end_page + 1): pn = urllib.urlencode({'pn': page * 50}) url = base_url + keyword + "&" + pn html = get_request(url) write_html(html, page) print "结束时间", time.time() - start_timedef main(): """程序的入口""" # name = raw_input("请输入你要爬取的贴吧的名称:>>>") name = "美女" start_page = int(raw_input('请输入开始的页码:>>>')) end_page = int(raw_input('请输入结束的页码:>>>')) spider(name, start_page, end_page)if __name__ == "__main__": main()
加入多线程
#!/usr/bin/env python# -*- coding: utf-8 -*-import urllibimport urllib2import osfrom threading import Threadimport threadingimport timedef get_request(url): """发起请求""" header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1'} request = urllib2.Request(url, headers=header) try: response = urllib2.urlopen(request, timeout=5) if response.getcode() == 200: html = response.read() return html else: print('请求失败....') except Exception as err: print(err)def write_html(html, page): """爬取出来的内容写入到文件中""" file_path = os.path.join('./贴吧', '贴吧的第' + str(page) + '内容.html') try: with open(file_path, 'w') as fp: fp.write(html) print('保存成功') except Exception as err: print(err)def thread_task(url, page): """多线程执行任务的函数""" html = get_request(url) write_html(html, page) print(threading.current_thread().name, url)def spider(name, start_page, end_page): """爬虫主程序""" base_url = 'https://tieba.baidu.com/f?' keyword = {"kw": "美女"} # 编码 keyword = urllib.urlencode(keyword) t_list = [] # 存放建立的线程 start_time = time.time() for page in range(start_page, end_page + 1): pn = urllib.urlencode({'pn': page * 50}) url = base_url + keyword + "&" + pn # 创建线程对象 t = Thread(target=thread_task, args=(url, page)) t_list.append(t) # 开启线程 t.start() # 使用join 加入等待 线程结束 for t in t_list: # 遍历线程加入等待 t.join() print ("结束时间", time.time() - start_time)def main(): """程序的入口""" # name = raw_input("请输入你要爬取的贴吧的名称:>>>") name = "美女" start_page = int(raw_input('请输入开始的页码:>>>')) end_page = int(raw_input('请输入结束的页码:>>>')) spider(name, start_page, end_page)if __name__ == "__main__": # 判断文件夹的程序放在了主程序中 防止多个线程同时去执行这段代码 这里没有使用线程锁 if not os.path.exists('./贴吧'): os.mkdir('./贴吧') main()
阅读全文
0 0
- 学习爬虫基础5-一个简单的小案例
- python一个简单的小爬虫
- 正则学习:简单的Python小爬虫
- 学习:C#实现一个简单的爬虫
- 6、一个简单的新氧的小爬虫
- python 特别简单的一个小爬虫(看着玩吧 )
- 一个简单的爬虫
- 一个简单的爬虫
- 一个简单的爬虫
- 爬虫 scrapy 框架学习 1. Scrapy框架业务逻辑的理解 + 简单爬虫案例示范
- [Python]网络爬虫(六):一个简单的百度贴吧的小爬虫
- [Python]网络爬虫(六):一个简单的百度贴吧的小爬虫
- [Python]网络爬虫(六):一个简单的百度贴吧的小爬虫
- [Python]网络爬虫(六):一个简单的百度贴吧的小爬虫
- [Python]网络爬虫(六):一个简单的百度贴吧的小爬虫
- [Python]网络爬虫(六):一个简单的百度贴吧的小爬虫
- [Python]网络爬虫(六):一个简单的百度贴吧的小爬虫
- [Python]网络爬虫(六):一个简单的百度贴吧的小爬虫
- 关于JVM
- 2017 SiChuan collegiate programming contest 训练总结 【持续更新中】
- java远程连接调用Rabbitmq
- C++学习笔记——数据的共享与保护
- jdk自带的将中文转换为ASCII码的工具
- 学习爬虫基础5-一个简单的小案例
- 数据传输的本质
- 【微信小程序 五】ListView上拉加载
- Hive自定义函数
- Android Studio Gradle 各个版本下载
- 文件编程之系统调用
- ES6中的const命令
- 明月固件SS 遍历配置文件输出SS服务器延迟
- sahi简单操作总结一