您的位置:首页 > 理论基础 > 计算机网络

Http—Chrome—与Python爬虫

2017-10-02 12:29 225 查看

通过一个Url能得到什么?

举个栗子:

https://www.baidu.com/s?wd=%E9%BB%84%E9%87%91%E5%91%A87.1%E4%BA%BF%E4%BA%BA%E6%BD%AE&rsv_idx=2&tn=baiduhome_pg&usm=3&ie=utf-8&rsv_cq=%E6%96%B0%E6%B5%AA%E5%BE%AE%E5%8D%9A&rsv_dl=0_right_toplist_20811

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( )
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: