爬虫笔记三

1、urllib和urllib2区别

urllib和urllib2都是接受URL请求的相关模块,但是提供了不同的功能,最显著的区别如下:

(1)urllib仅可以接受URL,不能创建,设置headers的request类实例;

(2)但是urllib提供urlencode()方法用来GET查询字符串的产生,而urllib2则没有(这是urllib和urllib2经常一起使用的主要原因)

(3)编码工作使用urllib的urlencode()函数,帮我们讲key:value这样的键值对转换成‘key=value’这样的字符串,解码工作可以使用urllib的unquote()

 

2、urllib库的urlencode()方法

# encoding=utf-8

# IPython2 中的测试结果
import urllib

word = {"wd" : "博客园"}

# 通过urllib.urlencode()方法,将字典键值对按URL编码转换,从而能被web服务器接受。
ret = urllib.urlencode(word)
print ret

# 通过urllib.unquote()方法,把 URL编码字符串,转换回原先字符串。
print urllib.unquote(ret)

wd=%E5%8D%9A%E5%AE%A2%E5%9B%AD
wd=博客园

 

3、urllib2库的urlopen(),Request()方法的使用

  • GET请求一般用于我们向服务器获取数据。例如:用百度搜索:https://www.baidu.com/s?wd=中国
# encoding=utf-8
import urllib  # 负责url编码处理

import urllib2

url = "http://www.baidu.com/s?"
word = {"wd": "中国"}
word = urllib.urlencode(word)  # 转换成url编码格式(字符串)
newurl = url + word  # 拼接完整的url
headers = {
    'user-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36'}
request = urllib2.Request(newurl, headers=headers)
response = urllib2.urlopen(request)

print response.read()
  • POST方式:了Request请求对象的里有data参数,它就是用在POST里的,我们要传送的数据就是这个参数data,data是一个字典,里面要匹配键值对。

# encoding=utf-8
import urllib2
import urllib

# 有道翻译:http://fanyi.youdao.com/
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc' formdata = { "i": "警察", "from": "AUTO", "to": "AUTO", "smartresult": "dict", "client": "fanyideskweb", "doctype": "json", "version": "2.1", "keyfrom": "fanyi.web", "action": "FY_BY_REALTIME", "typoResult": "true" } data = urllib.urlencode(formdata) # 将字典以url形式编码 header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36', 'Referer': 'http://fanyi.youdao.com/', # 反盗链 } request = urllib2.Request(url=url, data=data, headers=header) response = urllib2.urlopen(request) print response.code # 响应状态码 print response.read() 200 {"type":"ZH_CN2EN","errorCode":0,"elapsedTime":0,"translateResult":[[{"src":"警察","tgt":"The police"}]]

 

4、 批量爬取贴吧页面数据

输入一个百度贴吧的地址,比如:

百度贴吧LOL吧第一页:http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=0

         第二页: http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=50

         第三页: http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=100

规律 : 每个贴吧url都是以'https://tieba.baidu.com/f?'开头,然后是关键字 kw=‘’贴吧名字‘’,再后面是 &pn=页数  (pn=0第一页,pn=50第二页,依次类推)

1.先写一个main,提示用户输入要爬取的贴吧名,并用urllib.urlencode()进行转码,然后组合url

2.接下来,写一个百度贴吧爬虫接口tiebaSpider(),需要传递3个参数给这个接口, 一个是main里组合的url地址,以及起始页码和终止页码,表示要爬取页码的范围。

3.前面写出一个爬取一个网页的代码。然后,将它封装成一个小函数loadPage(),供我们使用。

4.将爬取到的每页的信息存储在本地磁盘上,我们可以简单写一个存储文件的接口writePage()

# _*_ coding:utf-8 _*_
import urllib,urllib2

def loadPage(url,filename):
    #根据url发送请求,获取服务器响应文件
    print '正在下载' + filename
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36'}
  
request
= urllib2.Request(url,headers = headers)
    content = urllib2.urlopen(request).read()
    return content
def writePage(html,filename): #将html内容写入到本地 print '正在保存' + filename with open(unicode(filename,'utf-8'),'w') as f: f.write(html) print '_' * 30 def tiebaSpider(url,beginPage,endPage): #贴吧爬虫调度器,负责组合处理每个页面的url for page in range(beginPage,endPage + 1): pn = (page - 1) * 50 filename = '' + str(page) + '页.html' fullurl = url + '&pn=' + str(pn) # print fullurl # 调用loadPage()发送请求获取HTML页面 html = loadPage(fullurl,filename) # 将获取到的HTML页面写入本地磁盘文件 writePage(html,filename) if __name__ == '__main__': kw = raw_input('请输入贴吧名:') beginPage = int(raw_input('请输入起始页:')) endPage = int(raw_input('请输入结束页:')) url = 'https://tieba.baidu.com/f?' key = urllib.urlencode({'kw':kw}) # 组合后的url示例:http://tieba.baidu.com/f?kw=lol url = url + key tiebaSpider(url,beginPage,endPage)

 

5、urllib2库获取Ajax加载的动态页面

 只要response里面有 JSON数据,我们就可以找到服务器的数据来源

# encoding=utf-8

import urllib
import urllib2

url = "https://movie.douban.com/j/chart/top_list?"
headers = {"User-Agent": "Mozilla...."}

# 处理所有参数
formdata = {
    'type': '11',
    'interval_id': '100:90',
    'action': '',
    'start': '0',
    'limit': '10'
}
data = urllib.urlencode(formdata)

request = urllib2.Request(url, data=data, headers=headers)
response = urllib2.urlopen(request)

print response.read()

 

 

posted @ 2018-09-15 14:30  薄荷味日记  阅读(230)  评论(0编辑  收藏  举报