python爬虫编程实践task1

0 前期准备

知识目标:
了解http基础,html基础,尝试使用request-get爬取豆瓣电影信息,了解api的使用

0-1 Window 下安装配置ChromeDriver

(1)点击浏览器最右上角图标的查看浏览器版本

依次:最右上角home图标-帮助-关于GoogleChrome
可以看出在这里插入图片描述可以看出我的浏览器版本是75.0.3770.100

(2) 下载对应的ChromeDriver(是个.exe文件)

http://npm.taobao.org/mirrors/chromedriver/
在这里插入图片描述
这里有三个类似的,我选择的75.0.3770.140,可正常使用,说明最后的几位不相同也可

(3)将下载好的ChromeDriver.exe文件放在Chrome的根目录下: 我的是

在这里插入图片描述
另外,如果想要在anaconda中使用,则需把ChromeDriver.exe文件放在anaconda的scripts目录下:
在这里插入图片描述

(4)配置环境变量:

右键点击我的电脑----->属性—>高级系统设置---->环境变量------>在path路径下添加上文中浏览器

.文件所在的根目录
需要注意的是:配置完环境变量后需要重启电脑才会生效!!!

0-2 配置其项目运行的相关环境

(1)创建虚拟环境

使用conda 创建基于python3.6的初始环境
在这里插入图片描述
这里踩了一个坑,报错如下:
在这里插入图片描述
解决方法:
找到.condarc文件
删掉channels下面的 -defaults一行
就ok啦。

(2)激活环境

activate spider_py

(3)将环境添加到jupyter中

python -m ipykernel install --user --name spider_py --display-name spider_py

如此,我们就可以在jupyter的kernel中找到我们新建的环境了
在这里插入图片描述

1、基础知识

1-1 HTTP

HTTP是一个客户端(用户)和服务器端(网站)之间进行请求和应答的标准。
HTTP的请求方法有很多种,主要包括以下几个:

GET:向指定的资源发出“显示”请求。GET方法应该只用于读取数据,而不应当被用于“副作用”的操作中(例如在Web Application中)。其中一个原因是GET可能会被网络蜘蛛等随意访问。

HEAD:与GET方法一样,都是向服务器发出直顶资源的请求,只不过服务器将不会出传回资源的内容部分。它的好处在于,使用这个方法可以在不必传输内容的情况下,将获取到其中“关于该资源的信息”(元信息或元数据)。

POST:向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求文本中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。

PUT:向指定资源位置上传输最新内容。

DELETE:请求服务器删除Request-URL所标识的资源,或二者皆有。

TRACE:回显服务器收到的请求,主要用于测试或诊断。

OPTIONS:这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用“*”来代表资源名称向Web服务器发送OPTIONS请求,可以测试服务器共能是否正常。

CONNECT:HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的连接(经由非加密的HTTP代理服务器)。方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Method Not Allowed),当服务器不认识或者不支持对应的请求方法的时候,应当返回状态码501(Not Implemented)。

1-2 网页基础

网页是由 HTML 、 CSS 、JavaScript 组成的。

HTML 是用来搭建整个网页的骨架,
CSS 是为了让整个页面更好看,包括我们看到的颜色,每个模块的大小、位置等都是由 CSS 来控制的, 
JavaScript 是用来让整个网页“动起来”,这个动起来有两层意思,一层是网页的数据动态交互,还有一层是真正的动,比如我们都见过一些网页上的动画,一般都是由 JavaScript 配合 CSS 来完成的。

2 初步学习与实践

一个网络爬虫程序最普遍的过程:

访问站点;
定位所需的信息;
得到并处理信息。

2-1 尝试使用request-get爬取豆瓣电影信息

import requests
import os

if not os.path.exists('image'):   #检查输出路径是否存在,不存在则创建
     os.mkdir('image')

def parse_html(url):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36"}   
        #模拟浏览器发送的Request Headers中的User-Agent
    res = requests.get(url, headers=headers)
    text = res.text
    item = []
    for i in range(25):
        text = text[text.find('alt')+3:]
        item.append(extract(text))
    return item
       
def extract(text):
    text = text.split('"')
    name = text[1]
    image = text[3]
    return name, image

def write_movies_file(item, stars):
    print(item)
    with open('douban_film.txt','a',encoding='utf-8') as f:
        f.write('排名:%d\t电影名:%s\n' % (stars, item[0]))
    r = requests.get(item[1])
    with open('image/' + str(item[0]) + '.jpg', 'wb') as f:
        f.write(r.content)
        
def main():
    stars = 1
    for offset in range(0, 250, 25):
        url = 'https://movie.douban.com/top250?start=' + str(offset) +'&filter='
        for item in parse_html(url):
            write_movies_file(item, stars)
            stars += 1

if __name__ == '__main__':
    main()

2-2 了解api的使用

下面以百度地图提供的API为例

首先我们打开链接:http://lbsyun.baidu.com/apiconsole/key 填写自己的信息
邮箱激活后点击申请密钥,然后填入下图信息,注意应用类型选择浏览器端
点击提交后就可以获得AK了

下面以两个小例子展示一下AK的作用:

<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
	<style type="text/css">
		body,
		html,
		#allmap {
			width: 100%;
			height: 100%;
			overflow: hidden;
			margin: 0;
			font-family: "微软雅黑";
		}
	</style>
	<script type="text/javascript" src="http://api.map.baidu.com/api?v=3.0&ak="></script> //在 ak=后面输入你的ak
	<title>地图展示</title>
</head>

<body>
	<div id="allmap"></div>
</body>

</html>
<script type="text/javascript">
	// 百度地图API功能
	var map = new BMap.Map("allmap"); // 创建Map实例
	map.centerAndZoom(new BMap.Point(116.404, 39.915), 11); // 初始化地图,设置中心点坐标和地图级别
	//添加地图类型控件
	map.addControl(new BMap.MapTypeControl({
		mapTypes: [
			BMAP_NORMAL_MAP,
			BMAP_HYBRID_MAP
		]
	}));
	map.setCurrentCity("北京"); // 设置地图显示的城市 此项是必须设置的
	map.enableScrollWheelZoom(true); //开启鼠标滚轮缩放
</script>

然后用Chrome打开这个文件,效果如下图所示:
在这里插入图片描述
第2个例子:

import requests

def getUrl(*address):
    ak = ''  ## 填入你的api key
    if len(address) < 1:
        return None
    else:
        for add in address:   
            url = 'http://api.map.baidu.com/geocoding/v3/?address={0}&output=json&ak={1}'.format(add,ak)  
            yield url
            

def getPosition(url):
    '''返回经纬度信息'''
    res = requests.get(url)
    #print(res.text)
    json_data = eval(res.text)
    
    if json_data['status'] == 0:
        lat = json_data['result']['location']['lat'] #纬度
        lng = json_data['result']['location']['lng'] #经度
    else:
        print("Error output!")
        return json_data['status']
    return lat,lng

if __name__ == "__main__":
    address = ['北京市清华大学','北京市北京大学','保定市华北电力大学','上海市复旦大学','武汉市武汉大学']
    for add in address:
        add_url = list(getUrl(add))[0]
        print('url:', add_url)
        try:
            lat,lng = getPosition(add_url)
            print("{0}|经度:{1}|纬度:{2}.".format(add,lng,lat))
        except Error as e:
            print(e)

输出入下图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值