爬虫学习day1

第一章

定义:网络爬虫是一种按照一定规则,自动抓取互联网信息的程序或者是脚本。

本质上是模拟浏览器打开网页,获取网页数据

1发送请求 2获取响应 3解析数据 4保存数据

万事开头难,第一步安装。

略(网上太多了,有错的话把错误粘到百度)

1发送请求

 浏览器发送消息给网址所在的服务器(http请求)

 包括

        请求URL,请求方法,请求头,请求体

2获取响应

响应状态:状态代码

响应头部:内容长度/类型等

响应体:内容

3解析数据

4保存数据

提取数据-----.csv/json/db

Requests库

1安装

Cmd中打入

pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple/

使用一下

import requests
res =requests.get(
"https://movie.douban.com/")#豆瓣
print(res.status_code)#状态码

成功截图:

 

代表安装成功,开始下一步!

分割-----------------

浏览下requests库方法:

 

  1. requests.request()

创建请求的通用方法

requests.request(method, url,**kwargs)

 

**kwargs一些参数

 

表中headers参数可设置为浏览器信息User Agent来模拟浏览器发送请求,User Agent(用户代理,简称UA)

服务器通过查看headers中的UA来判断是谁在访问。某些网站如豆瓣网必须设置UA信息才能进行访问。

UA可以进行伪装,Python允许用户修改User Agent来模拟浏览器访问,即伪装成浏览器,从而隐藏自己是爬虫程序的身份。

可选参数headers-UA获取

F12:进入开发者模式 /右键找到检查

 

单击网络->单击XHR ->选中get.ashx ->标头 ->User-Agent

点击Network网络
切换完毕后,F5刷新,重新加载资源。(之前没刷新也是什么也没有)
重新加载后选择筛选XHR资源(注意看这个Fetch/HXR

没有找到xhr,搜索得知

为什么天猫,京东等,网站控制台network中看不到xhr请求?

都走jsonp因为接口调用五花八门 都走cors的话 allow origin都配不完

 headers-UA获取

 

1通过requests.request()方法,伪装浏览器且以get方式访问百度首页数据的代码如下:

import requests

#导包

header = {

    'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 "

                  "Safari/537.36 Edg/107.0.1418.56"}

#上面获取得的User-Agent

url = "https://www.baidu.com/"

#url地址

res = requests.request('get', url, headers=header)

#get方法请求,请求头的ua信息

print(res.text)

#text打印
 
运行截图:

 

2使用requests库中的get方法

requests.get()方法 获取网页最常用的方式,该方法的语法格式如下:

requests.get(url,params=None,**kwargs)

 

import requests

params = {'spam': 1, 'eggs': 2, 'bacon': 0}

res =  requests.get('http://www.musi-cal.com/cgi-bin/query',params)

res.text[:10]

练习一下

import requests

url = 'https://www.baidu.com/'

res = ----------

print(res.text)

答案requests.get(url)

增加**kwargs中的headers参数,示例如下:

 
import requests

params = {'spam': 1, 'eggs': 2, 'bacon': 0}

header={'User-Agent':"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"}

res =  requests.get('http://www.musi-cal.com/cgi-bin/query',params,headers=header)

print(res.text)

调用get()方法后,返回的网页内容保存为一个Response对象:

import requests

res = requests.get("https://www.baidu.com/") #获取

print(type(res))

# 返回Response类型的对象
图:

 

和浏览器的交互过程一样,requests.get()代表请求过程,返回的Response对象代表响应,返回的内容作为一个对象便于操作,Response对象的主要属性如下表:

 

例子res.status_code # 返回状态

200

除了属性,response对象还提供一些方法,如下表:

 

其中json()方法能够在HTTP响应内容中解析存在的json数据,如下代码所示:

import requests

url = 'https://touch.dujia.qunar.com/depCities.qunar'

strhtml = requests.get(url)  # 获取出发地站点信息

print(strhtml.text) #返回json数据

dep_dict = strhtml.json()#解析json数据,返回字典格式

print(dep_dict)

for dep_item in dep_dict['data']: #dep_item即是a/b/c等

    for dep in dep_dict['data'][dep_item]:

        print(dep)#打印出发地

运行截图

 

raise_for_status()方法能在非成功响应后产生异常,这时可引入异常处理机制try...except.

 

通过requests库获取一个网页的通用代码框架如下:

 
import requests



def getHTMLText(url):

    try:

        r = requests.get(url,timeout = 30) # 设置超时时长为30秒

        r.raise_for_status()    # 如果HTTP响应状态码不是200,则产生异常

        r.encoding = r. apparent_encoding #设置编码方式,避免乱码

        return r.text     # 返回响应内容字符串

    except:

        return "产生异常"



#测试

url="https://www.baiu.com/" #https://www.baidu.com/


print(getHTMLText(url))

运行截图

 

3、requests.post()方法 用于向指定url提交表单数据,该方法的语法格式如下:

 

import requests
params = {
'spam': 1, 'eggs': 2, 'bacon': 0}
res = requests.post(
"http://www.musi-cal.com/cgi-bin/query", data=params)# 上传的数据,字典形式


print(res.text)
res= requests.post(
"http://httpbin.org/post",data = "helloWorld")#上传的数据,字符串形式



print(res.text)

练习

>>>import requests

>>>import json

>>>url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule' >>>form_data = {'i':’我爱中国’, ...} #form_data为请求表单数据

>>>response =______________(____________,data= ____________)

>>>res = json.loads(response.text) >>>print(res)

答案:requests.post       url         form_data

实现任务:获取豆瓣网电影板块 (1.0版)https://movie.douban.com/cinema/nowplaying/whan 武汉正热映的页面数据。

import requests





def getMoviesHtmlTextRequests(url):

    header={'User-Agent':"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"}

    try:

        res = requests.get(url,headers=header)

        res.raise_for_status()

        res.encoding = res.apparent_encoding

        text= res.text

        return text

    except:

        return "获取电影数据失败"



url = 'https://movie.douban.com/cinema/nowplaying/wuhan/'

print(getMoviesHtmlTextRequests(url))

豆瓣网电影板块https://movie.douban.com/cinema/nowplaying/wuhan/主要展示了武汉市正在上映的电影,如何获取该网页数据呢?

除了上述第三方库requests可以获取网页数据, 还可以使用Python内置的urllib库来实现。

requests库是基于urllib封装而成的第三方库,十分便捷而受到青睐,但是urllib是内置库,对远程网页的操作更像操作本地文件一样,易于理解。

下一day通过urllib库获取网页数据

1day的总结

首先是在f12查看那个开发者工具时找不到XHR资源

我是没有注意到Fetch/HXR还有有的网站可能木有

还要f5刷新下才出来

然后是requests的get/post方法,在复现代码时候倒是没有什么错误,无非是库的导入什么的,不过这个过程,这个还是需要进一步练习才熟悉的。

还有一些细节的东西   例如抛出异常的结构 等等,也需要自己琢磨

计划在近几天完成day2和day1的复习

还有对于安卓开发项目启动准备,

回想一下大学前两年,学习的东西忘掉的差不多,

。。。无了,等待更新和修改

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值