通过一个Url能得到什么?
举个栗子:
url包含:协议 + 域名(IP) + 路由 + 端口 + 参数
Url基本类型: GET POST
一个小技能:在终端Ping一个域名就能得到一个网站的IP
Chrome 大法好
在Chrome的右键选项单中,‘检查’这一项可以得到向这个网页绝大部分的内容。
其中,爬虫中最常用的几个类型:XHR DOC WS
初试Python爬虫
Python 中
爬取数据的model是Urllib2&Urllib
分析是json用的是json
筛选html用的是BeautifulSoup
下面以搜狐考试为例我们来试一下 GET 和 POST
# GET
# url = 'http://kaoshi.edu.sina.com.cn/college/scorelist'
# request = urllib2.Request(url=url)
# response = urllib2.urlopen(request, timeout=20)
# result = response.read()
# print result
# POST
# url = 'http://shuju.wdzj.com/depth-data.html'
# data = urllib.urlencode({'type1': 1, 'type2': 2, 'status': 0, 'wdzjPlatId': 59})
# request = urllib2.Request(url)
# opener = urllib2.build_opener(urllib2.HTTPCookieProcessor())
# response = opener.open(request, data)
# result = response.read()
#
# for key in json.loads(result).keys():
# print key
一道题:把豆瓣热门tag下20部电影的名字打印出来
#第一步:设置语言环境
# encoding: utf8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
#第二步:加载需要的模块
from bs4 import BeautifulSoup
import urllib2
import json
#第三部:爬豆瓣的tag,基本参数设置
url = 'https://movie.douban.com/j/search_tags?type=movie&source='
request = urllib2.Request(url=url)
response = urllib2.urlopen(request, timeout=20)
#第四步:创建tag实例,把我们抓到的tag装进去
tags = result['tags']
#第五步:开始抓电影名字了,这里我们先把这个网页拿到手,然后把网页内有一个包含20个电影的url保存在我们的movies[item]内。
movies = []
for tag in tags:
limit = 0
while 1:
#我们为了抓取的可设置性,所以把两个最核心的参数设置成变量
url = ' https://movie.douban.com/j/search_subjects?type=movie&tag=' + tag + '&sort=recommend&page_limit=20&page_start='+ str(limit)
request = urllib2.Request(url=url)
response = urllib2.urlopen(request, timeout=20)
result = json.loads(response.read())
#并且使这个变量自增,所以省去每次都要手改的功夫
result = result['subjects']
limit += 20
#设置当爬不到数据(到头了)就中断
if len(result) == 0:
break
把爬到的数据放进movies实例中
for item in result:
movies.append(item)
#####
break #因为咱们这里只要20个。取消循环
#####
break #因为咱们这里只要20个。取消循环
#写个标题先
print '最近豆瓣最热的20部电影List'
#第六步:遍历得到的item里面20部电影里面20部电影的网站,从中抓取电影名
###xrange与range的区别
1、range()和xrange() 在Python 2里是两种不同的实现。但是在Python 3里,range()这种实现被移除了;
2、range返回的是一个包含所有元素的列表,xrange返回的是一个生成器,生成器是一个可迭代对象,在对生成器进行迭代时,元素是逐个被创建的。一般来看,在对大序列进行迭代的时候,因为xrange的特性,所以它会比较节约内存。
3、xrange 不可切片
###
for x in xrange(0,len(movies)):
item = movies[x]
#url item字典里有一个url属性,就是每个电影的内页面
request = urllib2.Request(url=item['url'])
response = urllib2.urlopen(request, timeout=20)
result = response.read()
#用BeautifulSoup处理html
html = BeautifulSoup(result,"html.parser")
#从html中筛选h1的第一项
title = html.select('h1')[0]
#从h1中筛选span的第一项
title = title.select('span')[0]
#把获得的东西转换成文本
title = title.get_text()
print title
#第七步:把你抓取到的title 丢进movies里面
movies[x]['title'] = title
#第八步:把手机到的结果输出到movies.txt
fw = open ('movies.txt','w')
for item in movies :
tmp = ''
for key,value in item.items():
tmp += str(value) + ','
fw.write(tmp[:-1],'\n') #每输出一个电影的相关参数就换一行,数据更整齐
fw.close( )