(初学者)爬取静态网页数据

目录

一、urllib库

1、了解什么是urllib库

2、快速使用urllib爬取网页

3、设置代理服务器

4、超时设置

5、实践项目urllib库--某官网图片批量提取

二、requests库

1、发送基本请求

1.1使用get()函数可以发送不携带url参数和携带url参数的GET请求

1.2处理响应

2、处理复杂请求

2.1定制请求头

2.2验证Cookie

3、实践项目:爬取百度贴吧的传智播客



一、urllib库

1、了解什么是urllib库

urllib库是python内置的HTTP请求库,它可以看作是处理URL的组件集合

以下是常用模块名称及作用:

2、快速使用urllib爬取网页

import urllib.request
#调用urllib.request库的urlopen()方法,并传入一个url,即目标网站
response=urllib.request.urlopen('http://www.baidu.com')
#使用read方法读取获取到的网页内容
html=response.read().decode('Utf-8')
#打印网页内容
print(html)

上述仅仅用几行代码就已经帮我们把百度的首页代码下载下来了。实际上,如果我们在浏览器上打开百度主页,右键“查看源代码”,你会发现,跟我们打印出来的是一模一样。

爬取网页时,有一句核心的爬虫代码:response=urllib.request.urlopen('http://www.baidu.com')

这句代码调用的是urllib.request模块中的urlopen方法,它传入了一个百度首页的URL,使用的协议是HTTP,这是urlopen方法最简单的用法

以下是urlopen()方法的语法格式和具体含义,在使用urlopen方法的时候,需要传递很多的参数,实事上大多数时候只需要关注前面的url、data、timeout这3个参数就行。

(1)url:String类型的地址,也就是我们要访问的URL。

(2)data:参数指的是在请求的时候,需要提交的数据。

(3)timeout:参数用于设置请求超时的时间,单位是秒

(4)cafile和capath:代表CA证书和CA证书的路径,如果使用HTTPS,则需要用到。

(5)context:用来指定SSL设置,必须是ssl.SSLContext类型。

3、设置代理服务器

设置代理服务器的作用是:每隔一段时间换一个代理,如果某个IP被禁止,那么就可以换成其他IP继续爬取数据,从而可以有效解决被网站禁止访问的情况。

urlopen不支持代理、Cookie等其他的HTTP/HTTPS高级功能,所以如果要想设置代理,不能使用自带的urlopen,而是要自定义openr。我们可以使用urllib.request中的ProxyHandler方法来设置代理服务器。

import urllib.request

# 设置代理IP
proxy_ip = "http://www.xicidaili.com/nt/"
# 构造代理处理器对象
proxy_handler = urllib.request.ProxyHandler({"http": proxy_ip})
# 构造一个自定义的opener对象
opener = urllib.request.build_opener(proxy_handler)
# 使用自定义的opener对象发起访问请求response
pro= opener.open("http://www.baidu.com")
# 打印请求结果
print(pro.read().decode("utf-8"))
print(pro.getcode())

免费代理网站主要有一下几个:

  1. 西刺免费代理IP
  2. Proxy360代理
  3. 快代理免费代理
  4. 全网代理IP

4、超时设置

我们可以为HTTP请求设置超时时间,一旦超过这个时间,服务器还没有返回响应内容,就会抛出一个超时异常。

import requests
#设置超时时间
r = requests.get("https://www.taobao.com",timeout=1)
print(r.status_code)

5、实践项目urllib库--某官网图片批量提取

import re
import urllib.request
from os import path
response = urllib.request.urlopen('目标子网站')
html = response.read().decode('UTF-8')
imgs = re.findall(r'<img.*src=\"(.+?(jpg))', html)
print(imgs)
for index,(img, pic) in enumerate(imgs):
    img = '目标网站' + img
    print(img)
    res_img = urllib.request.urlopen(img)
    tupian = res_img.read()
    filename = path.basename(img)
    with open("保存的位置" + filename, "bw") as f:
        f.write(tupian)
    print(f"第{index + 1}张图片下载成功")

运行结果会在你指定的位置打印照片即:

二、requests库

1、发送基本请求

在Requests库中,GET 请求通过调用get()函数发送,该函数会根据传入的URL构建一个请求(每个请求都是Request类对象),将该请求发送给服务器。get()函数声明如下:

get(url,params=None,headers=None,cookies=None,verify=True,proxies=None,timeout=None,**kwargs)

url:必选参数,表示请求的URL。

params:可选参数,表示请求的查询字符串。

headers:可选参数,表示请求的请求头,该参数只支持字典类型的值。

cookies:可选参数,表示请求的Cookie信息,该参数支持字典或CookiJar类对象。

verify:可选参数,表示是否启用SSL证书,默认值为True。

proxies:可选参数,,用于设置代理服务器,该参数只支持字典类型的值。

timeout:可选参数,表示请求网页时设定的超时时长,以秒为单位。

1.1使用get()函数可以发送不携带url参数和携带url参数的GET请求

不携带url参数的GET请求

import requests
#准备URL
base_url='https://www.baidu.com/'
#根据URL构造请求发送GET请求,接收服务器返回的响应信息
response=requests.get(url=base_url)
#查看响应码
print(response.status_code)

携带url参数的GET请求:

import requests
base_url='https://www.baidu.com/'
param='wd=python'
full_url=base_url+'?'+param#拼接完整的URL
#根据URL构造请求,发送GET请求,接收服务器返回响应信息
response=requests.get(full_url)
##查看响应码
print(response.status_code)
1.2处理响应

为了保证获取的源代码中能够正常显示中文,这里需要通过Response对象的encoding属性将编码格式设置为UTF-8。

import  requests
base_url='https://www.baidu.com/'
#根据URL构造请求,发送GET请求,接收服务器返回响应信息
response=requests.get(base_url)
#设置响应内容的编码格式
response.encoding='utf-8'
#查看响应内容
print(response.text)

2、处理复杂请求

2.1定制请求头

在requests中,设置请求头的方式非常简单,只需要在调用请求函数时为headers参数传入定制好的请求头即可,一般是将请求头中的字段与值分别作为字典的键的值,以字典的形式传给headers参数。

header={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0'}
2.2验证Cookie

Cookie(有时也用其复数形式Cookies)是指某些网站为了分辨用户身份、进行会话跟踪,而暂时存储在用户端的一段文本数据(通常经过加密)。Cookies参数需要接收一个RequestsCookieJar类的对象,该对象类似一个字典,它会以名称(Name)与值(Value)的形式存储Cookie。

发送请求方式一:

import requests
headers={
    'Cookie':'此处填写登录百度网站后查看的Cookie信息',
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0'
}
response=requests.get('http://tieba.baidu.com/',headers=headers)
print(response.text)

发送请求方式二:

import requests
header={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0'
}
cookie:'此处填写登录百度网站后查看的Cookie信息'
#创建RequestsCookieJar类对象
jar_obj=requests.cookies.RequestsCookieJar()
#以逗号为分隔符分割cookie,并将获得的键和值保存在jar_obj中
for temp in cookie.split(';'):
    key,value=temp.split('=',1)
    jar_obj.set(key,value)
response=requests.get('http://www.baidu.com/',headers=header,cookies=jar_obj)
print(response.text)

3、实践项目:爬取百度贴吧的传智播客

import urllib.request
import urllib.parse
def tieba_spider(url, begin_page, end_page):
    for page in range(begin_page, end_page+1):
        pn=(page-1)*50
        file_name="第"+str(page)+"页.html"
        full_url=url+"&pn="+str(pn)
        html=load_page(full_url,file_name)
        write_page(html,file_name)
def load_page(url,filename):
    headers={"User-Agent":"Mozilla/5.0 (compatible; MSIE 9.0 Windows NT 6.1; Trident/5.0;)"}
    request =urllib.request.Request(url, headers=headers)
    return urllib.request.urlopen(request).read()
def write_page(html,filename):
    print("正在保存"+filename)
    with open(filename,'w',encoding='utf-8') as file:
        file.write(html.decode('utf-8'))
if __name__=="__main__":
    kw=input("请输入需要抓取的贴吧名:")
    begin_page=int(input("请输入起始页:"))
    end_page=int(input("请输入结束页:"))
    url='http://tieba.baidu.com/f?'
    key=urllib.parse.urlencode({"kw":kw})
    url=url+key
    tieba_spider(url, begin_page, end_page)

运行结果如下:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值