day1、第一个爬虫

2018-08-13  本文已影响0人  是东东

第一个爬虫

import urllib.request
url = "http://www.baidu.com/"
#1、urlopen(url="xxx")
res = urllib.request.urlopen(url=url)
#urlopen打开一个远程连接,并返回该连接的响应对象
print(res)#<http.client.HTTPResponse object at 0x000001EF7CEA6EB8>
#响应对象包含响应头和响应体
#res.read()从响应对象中读取响应体,返回的是html源码,通过decode('utf-8')转换编码
print(res.read().decode('utf-8'))
#2、urlretrieve(url, filename)
#作用把url网站下的数据存储到filename中
#通过urllib.request.urlretrieve(url=url, filename= './baidu.html')下载需求文件
img_url = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1534154325880&di=c6993e66d989bf655ed7bdde428eb597&imgtype=0&src=http%3A%2F%2Fphotocdn.sohu.com%2F20150907%2Fmp30906533_1441629699374_2.jpeg"
urllib.request.urlretrieve(url=img_url, fielname="./girl.jpeg")
#3、urlencode()
    # url = "https://www.baidu.com/s?ie=utf-8&f=8&&wd=%E5%BC%A0%E6%9F%8F%E8%8A%9D"  百度搜索张柏芝原本url
    # url = "https://www.baidu.com/s?ie=utf-8&f=8&&wd=张柏芝"  若手动修改成张柏芝则会报错
    #原因:urllib库不识别汉字,如果需要用汉字的话,需要将其转化成utf-8编码。
import urllib.parse #导入parse,主要处理url格式问题

url = "https://www.baidu.com/s?"
    #用parse库中的相关方法处理参数问题
    #1、要把待处理的参数wd=xxx写成字典形式
d = {"wd": "张柏芝"}
    #2、用urlencode方法将字典处理成url的参数
data = urllib.parse.urlencode(d)
print(data)#wd=%E5%BC%A0%E6%9F%8F%E8%8A%9D
res = urllib.request.urlopen(url=url+data) #拼接url
print(res.read().decode("utf-8")) #从响应对象中读取响应体,返回是html源码,通过decode('utf-8')转换编码

#以上方法只能处理简单的http请求,如果遇到复杂的请求则不行(比如带请求头的)
# urllib.request.urlopen("http://weibo.cn/")#因没有请求头而报错403

GET请求

import  urllib.request

#get请求的
url = "http://weibo.cn/"#因没有请求头而报错403
#403报错因为遇到第一个反爬 用户代理:为了防止恶意的爬虫对网站的攻击会设置用户代理,后台通过判断用户代理的类型,并决定返回给客户端需求的数据,如果用户代理指代不明确就认为是爬虫,则拒绝访问,返回403错误
#如何设置用户代理?通过请求对象来伪装浏览器
#构建请求对象,用Request 类来创建
req = urllib.request.Request(url=url, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'})
res = urllib.request.urlopen(req)
print(res)
#另外:添加请求头还可以用add方法
req = urllib.request.Request(url=url)
#给请求头对象添加请求头
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36')
print(req)

POST请求 and 请求头添加方式

import urllib.request
import urllib.parse

url = "http://fanyi.baidu.com/sug"

#对于一个post请求,请求对象包含两部分,分别是请求头和请求体
#请求头:请求头中带着本次请求的相关的配置参数
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
}
#请求体:在post请求中,由于url中不能包含请求体,需要单独设置请求体
data = {
    "kw": "hello"
}
#把请求体处理成url参数类型
data = urllib.parse.urlencode(data).encode("utf-8")
print(data)
#用前面创建好的请求头和请求体来创建请求对象
req = urllib.request.Request(url=url, headers=headers, data=data)
#发送请求
res = urllib.request.urlopen(req)
print(res.read().decode("utf-8"))

爬贴吧

初始

from urllib import request,parse

#把函数看成功能的封装
#定义一个函数,用于处理url(你给我一个url,我给你一个请求对象)
def handle_url(url, baname):

    return "请求对象"

#定义一个函数,用于用请求对象发起请求,并且返回请求的响应结果
def request_data(req):
    return "响应结果"

#定义一个main函数,用于处理业务逻辑
def main():
    url = "http://tieba.baidu.com/f?"
    #通过终端来动态输入一个贴吧的名字
    name = input("请输入你要爬去的贴吧名字:")
    #创建请求对象
    req = handle_url(url, name)
    #根据请求对象发起请求
    res = request_data(req)
    print(res)

#把main函数调用起来
if __name__ == "__main__":
    main()

完整内容

爬取到的是一个html源代码

from urllib import request,parse

#把函数看成功能的封装
#定义一个函数,用于处理url(你给我一个url,我给你一个请求对象)
def handle_url(url, baname):
    #设置请求头
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'}
    #设置请求体
    data = {"kw": baname}
    #处理成请求参数
    data = parse.urlencode(data)
    #拼接到url后面
    url += data
    #根据请求头和请求体创建请求对象
    req = request.Request(url=url, headers=headers)
    return req

#定义一个函数,用于用请求对象发起请求,并且返回请求的响应结果
def request_data(req):
    res = request.urlopen(req)
    return res.read().decode("utf-8")

#定义一个main函数,用于处理业务逻辑
def main():
    url = "http://tieba.baidu.com/f?"
    #通过终端来动态输入一个贴吧的名字
    name = input("请输入你要爬去的贴吧名字:")
    #创建请求对象
    req = handle_url(url, name)
    #根据请求对象发起请求
    res = request_data(req)
    print(res)

#把main函数调用起来
if __name__ == "__main__":
    main()
上一篇下一篇

猜你喜欢

热点阅读