爬虫:通过程序,根据url爬取网页,获取有用信息。是怎么做到的呢:让程序模拟浏览器,向服务器发送请求,获取响应信息
url的组成
https://www.baidu.com/s?wd=gege
协议:https 主机:www.baidu.com 端口号:443 路径:s 参数:wd=geg 锚点:#
常见端口号:http 80 htttps 443 mysql 3306 redis 6379
我的第一个爬虫程序 urllib.request.urlopen()
import urllib.request url="http://www.baidu.com" #打开url连接,向服务器发送请求 response=urllib.request.urlopen(url) print(type(response))#http.client.HTTPResponse """ response 6个方法 read readline readlines getcode geturl getheaders """ #read()获取响应页面中的源码,返回的是字节形式的二进制数据 #response.read().decode("utf-8")转为字符串 content=response.read() print(type(content))#bytes #读取一行(字节) print(response.readline())# b'<!DOCTYPE html><!--STATUS OK-->\n' #一行一行读,读取全部 print(response.readlines()) #获取url地址 print(response.geturl()) #http://www.baidu.com #获取状态码,200是正常 print(response.getcode())#200 # print(response.getheaders())
下载网页、图片、音频、视频
urllib.request.urlretrieve()
""" 下载网页 """ import urllib.request url_page="http://www.baidu.com" urllib.request.urlretrieve(url=url_page,filename="mydownload.html") """ 下载图片 """ url_img="https://img1.baidu.com/it/u=119577736,3667686564&fm=253&fmt=auto&app=138&f=JPEG?w=889&h=500" urllib.request.urlretrieve(url=url_img,filename="mypicture.jpg")
看我用python下载的图片

第一个反爬User-Agent
import urllib.request url="https://www.baidu.com" #向服务器发送请求 response=urllib.request.urlopen(url) #解码 content=response.read().decode("utf-8") print(content)
从运行结果,得知我们获取到的数据并不完整。正是因为被反爬了。。。

怎么解决呢?请求对象的定制
import urllib.request url="https://www.baidu.com" """ 请求对象的定制 """ headers={ "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36" } request=urllib.request.Request(url=url,headers=headers) #向服务器发送请求 response=urllib.request.urlopen(request) #解码 content=response.read().decode("utf-8") print(content)
url参数的unicode编解码
unicode应运而生,unicode把所有语言都统一到一套编码里,解决乱码问题。
汉字转unicode编码
import urllib.parse #把赖神变为unicode编码格式 name=urllib.parse.quote("赖神") print(name)#%E8%B5%96%E7%A5%9E
那么就可以这么用了。相当于在百度搜索栏输入了赖神,按了回车键。
import urllib.request url="https://www.baidu.com/s?wd=" import urllib.parse """ 把赖神变为unicode编码格式 """ name=urllib.parse.quote("赖神") print(name)#%E8%B5%96%E7%A5%9E #请求对象的定制 headers={ "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36" } request=urllib.request.Request(url=url+name,headers=headers) #向服务器发送请求 response=urllib.request.urlopen(request) #获取网页源码的数据,decode解码 content=response.read().decode("utf-8") print(content)
那要是有多个参数呢,一个一个拼吗?显然还有更好地办法
import urllib.parse data={ "wd":"赖神", "sex":"男" } #这多省劲 参数unicode化 print(urllib.parse.urlencode(data)) #wd=%E8%B5%96%E7%A5%9E&sex=%E7%94%B7
原创文章,作者:优速盾-小U,如若转载,请注明出处:https://www.cdnb.net/bbs/archives/30994