爬去百度贴吧中的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 urllib
In [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 urllib
import urllib2
import os
import time
def 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_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__":
main()
加入多线程
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib
import urllib2
import os
from threading import Thread
import threading
import time
def 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()