python爬虫——最基础笔记

来源:互联网 发布:linux rpm安装命令jdk 编辑:程序博客网 时间:2024/06/04 19:29

爬虫——模拟客户端发送请求,爬取互联网信息的程序。

基本步骤:1、获取url地址。 2、发送请求,获取响应数据(模拟浏览器)。3 提取数据。4、数据保存。

今天只是实现了最最最最最简单的爬虫,没有多进程,没有循环。
1、获取url地址。:
工具:浏览器(推荐Chrome谷歌浏览器)

打开浏览器,按F12启动开发和调试器,输入心仪网址(例如度娘),刷新当前页面,点击Network,查看返回文件群。
Network中会有一堆文件都是响应文件
返回的文件格式一般图片是 png、jpg等,以及html报文所需要的组件 css, js文件,网页信息文件一般在 后缀是html文件、或者json文件(js)结尾。
就酱
url地址一般在点击该文件后出现的”Headers”的”General”的”Requests URL”中一般不直接复制浏览器中的地址(有些浏览器时隐藏部分参数的)。
url正确地址不一定在第一个返回文件中,要对比chrome浏览器上的地址,比如图片的url就跟他相差甚远
ps:动态网址,此方法失效。实战里要爬取多个网页,需要rul群,这样就需要找到url规律。一般网站观察跳几页参数规律就能找到,url中有些参数一直不变的可以尝试删除。

2、发送请求,获取响应数据(模拟浏览器)。
发送请求,获取响应报文
发送请求其中一种方式是利用urllib(urllib3)模块
简单参考:http://www.cnblogs.com/KGoing/p/6146999.html

这里使用Requests模块,因为urllib的功能它都有,且更简单,更全面(别人说的)
ps:requests的开发哲学

1. Beautiful is better than ugly.(美丽优于丑陋)2. Explicit is better than implicit.(直白优于含蓄)3. Simple is better than complex.(简单优于复杂)4. Complex is better than complicated.(复杂优于繁琐)5. Readability counts.(可读性很重要)

http发送请求分为get、post
对比理解get、post不同之处 get发送透明报文,post一般是发送加密报文请求数据(比如账号密码登录,需要提交数据请求用户界面。)相比于get请求,简单的post请求需要多传输data数据(一般json格式的)。
代码如下:

发送get请求

import requestsurl='https://www.baidu.com/';response =requests.get(url) print(response.status_code) #响应对象response的方法 status_code 返回200 成功。print(response.content) #content方法返回的是字节类型,也即是二进制,如果需要接收图片的话返回这个类型,print(response.content)

三种将二进制字节类型转换成str字符串:

reponse.content.decode() #默认按照utf-8编码解码
reponse.conent.text #封装的text 方法
reponse.content.decode(‘GKB’) #GKB接触不多,前两种不行再用它。

发送简单的post请求

以模拟翻译网页为例,不同的是传给服务器的具体数据,得去网站自己获取,操作类似url获取方式,现在大部分使用json数据,下面注释部分是提取过程用到了json方法,结果是 HOW ARE YOU

import requestsimport jsonurl ='http://fanyi.baidu.com/v2transapi';post_data ={            "from": "zh",            "to": "en",            "query": '你好吗',            "transtype": "translang",            "simple_means_flag": "3"        }response=requests.post(url, data=post_data)print(response.status_code) #成功的话返回200# r=response.content.decode()# dict_response=json.loads(r)# str=dict_response['trans_result']['data'][0]['dst']# print(str)  #HOW ARE YOU对应字段 'query':‘你好吗’

在请求代码中可以传递常用的几个参数:
一、url——字符串类型(已经用烂了)
二、headers——json类型,名为请求头,爬虫用来模拟浏览的参数,常传参数是浏览器代理{‘User-Agent’:’…’} ,同一个浏览类的值不变,以及cookie
就是让爬虫程序伪装的更像游览器所传递的参数
Request Headers——中文翻译就是请求头,cookie和User-Agent都在这里

import requestsurl='https://www.baidu.com/';headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36'}response =requests.get(url,headers=headers)print(response.status_code)

三、params 是指url 的参数,以百度搜索 123 为例
https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=123&oq=%25E4%25BD%25A0%25E5%25A5%25BD&rsv_pq=819dcc8e000071c3&rsv_t=7e88oPiHu29BNZl7nPHv4fCCYF%2FaaGv4%2BxSi8tWy55zNmBp1kq7APfIxwQ4&rqlang=cn&rsv_enter=1&inputT=925&rsv_sug3=10&rsv_sug1=9&rsv_sug7=100&rsv_sug2=0&rsv_sug4=926
可以找到www.baidu.com后面一大堆里有个参数:wd=123

import requestsurl='https://www.baidu.com/';parmas ={'wd':'123'}response =requests.get(url,params=parmas)print(response.status_code)print(response.url) # https://www.baidu.com/?wd=123
# 这个代码的url是失败的,没有返回正确的123搜索链接,不过参数传进去了。哈哈可以达到两个目的,第一参数传递完成了,第二有些看不懂的参数还是要传递的,正确的url不总是那么简单!

四、proxies 代理,运用代理可以隐藏真实的访问ip地址,使用多个代理,可以有效的反反爬虫。同样是为了装的很像。
实战的时候用一堆代理,爽歪歪。
例如:

import  requestsproxies = {"http":"http://107.175.146.5:1080";} #此代理网上找的免费代理,啥时候失效看人家了r = requests.get("http://www.baidu.com",proxies=proxies)print(r.status_code)

3 提取数据(json、正则、xpath、selenium等)。
此处只先提出方法,举例最简单的方法其他单独补充
数据提取最简单的方式,没有过滤的话是response.content.decode()/response.content.text,直接可以获取响应全部报文
代码如下:

import requestsurl='https://www.baidu.com/';parmas ={'wd':'123'}headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36'}response =requests.get(url,headers=headers,params=parmas)text =response.content.decode()print(text)

具体提取(就不写了,到时候需要学好了找个单独位置写):
1)正则表达式匹配
2)json方法提取转化
3)lxml、xpath 定位元素提取
4)selenium 自动化测试工具获取提取数据

4 数据保存
4.1保存文字

import requestsurl='https://www.baidu.com/';headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36'}response =requests.get(url,headers=headers)text =response.content.decode()# 将提取的字符串,保存在本地文件中with open('wendang.txt','w') as file:    file.write(text)
4.2保存图片 
import requestsr =requests.get('https://www.baidu.com/img/bd_logo1.png'#获取图片地址保存with open ('baidu.gif','wb') as f:    f.write(r.content)  # 图片格式是二进制数据,不能保存图片使用字符串保存。conent后千万不要去解码了。