B站教学链接 点击进入
1.首先学会get、post请求和封装
所需要的包
import urllib.request
import urllib.parse
获取一个get请求
res=urllib.request.urlopen("http://www.baidu.com")
print(res.read().decode('utf-8')) #对获取到的网页源码要记得解码
res=urllib.request.urlopen("http://www.baidu.com")
获取一个post请求(需要传递参数,注意字符的解码)
import urllib.parse
data=bytes(urllib.parse.urlencode({"hello":"world"}),encoding="utf-8")
res =urllib.request.urlopen("http://httpbin.org/post",data=data)
print(res.read().decode("utf-8"))
超时处理
try:
response =urllib.request.urlopen("http://httpbin.org/get",timeout=0.01)
print(response.read().decode("utf_8"))
except urllib.error.URLError as e:
print("time out")
res =urllib.request.urlopen("http://www.baidu.com",timeout=1)
print(res.getheader("Server"))
封装请求对象
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36"
}
data=bytes(urllib.parse.urlencode({"hello":"world"}),encoding="utf-8")
url="http://httpbin.org/post"
req=urllib.request.Request(url=url,data=data,headers=headers,method="POST") #请求对象封装
res =urllib.request.urlopen(req)
print(res.read().decode("utf-8"))
访问豆瓣
import urllib.request
import urllib.parse
url="https://www.douban.com"
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36",
}
req=urllib.request.Request(url=url,headers=headers)#封装好的对象
res=urllib.request.urlopen(req)
print(res.read().decode("utf-8"))
2.目标html的解析与搜索
import re
from bs4 import BeautifulSoup
file =open("./uniapp.html","rb")#二进制读取,把文件读取到内存里面
html =file.read().decode("utf-8")#读到对象里面
bs=BeautifulSoup(html,"html.parser")#解析html文档
print(type(bs.title))#拿到标签及其内容(第一个)
print(bs.a)
print(bs.head)
print(bs.title.string)#标签里的内容
print(bs.head.attrs)#字典的形式保存,保存标签的属性
print(bs.name)#整个文档
print(bs.head.string)
#文档的遍历
print(bs.head.contents)
print(bs.head.contents[1])
#(都是按标签找)
#文档的搜索
find_all()
#字符串过滤:会查找与字符串完全匹配的内容
t_list=bs.find_all("a")
#正则表达式搜索:使用search()方法来匹配内容
import re
t_list=bs.find_all(re.compile("a"))
#方法:传入一个函数,根据函数的要求来搜索
def name_is_exists(tag):
return tag.has_attr("id")
t_list=bs.find_all(name_is_exists)
for item in t_list:
print(item)
print(t_list)
# #kwargs参数
t_list =bs.find_all(id="app")
t_list =bs.find_all(class_=True)
#t_list=bs.find_all(class_="dfs")
for item in t_list:
print(item)
#test参数
t_list =bs.find_all(text=["第一个","第二个"])
t_list =bs.find_all(text=re.compile("\d"))#应用正则表达式来查找包含特定文本内容内容(标签里的字符串)
#limit参数
t_list =bs.find_all("a",limit=3)
for item in t_list:
print(item)
#css选择器
t_list=bs.select("title")#通过标签
t_list=bs.select(".dfs")#通过内容
t_list=bs.select("#u1")#通过id来查找
t_list=bs.select("a[class='dfs']")#通过属性来查找
t_list=bs.select("div>a")#通过子标签
for item in t_list:
print(item.get_text())
#正则表达式
3.正则表达式:字符串模式(判断字符串是否符合一定的标准)
import re
#创建模式对象
pat=re.compile("AA")#此处的AA是一个正则表达式,用来验证其他的字符串
m=pat.search("AAAAAAAAAAAAAAAAABAA")#search方法进行比对查找
#没有模式对象
m=re.search("asd","Aasd")
print(m)
m=re.findall("[a-z]+","lsaAk3jdfla")
print(m)
#sub
print(re.sub("a","asdfasdf","lajfas")) #找到a用A来替换
#建议在正则表达式中,被比较的字符串前面加上r,不用担心转义字符问题
a=r"\naabd\sdf"
print(a)
4.爬取豆瓣电影top250实战
所需要的包
from bs4 import BeautifulSoup #网页解析获取数据
import re #正则表达式
import urllib.request,urllib.error #制定url,获取网页数据
import xlwt #进行excel制作
import sqlite3 #进行SQLITE数据库操作
def main():
baseurl="https://movie.douban.com/top250?start="
#1爬取网页
datalist=getData(baseurl)
savepath=r".\豆瓣电影TOP350.xls"
#3保存数据
saveData(savepath)
#<a href="https://movie.douban.com/subject/1292052/">
#<img alt="肖申克的救赎" class="" src="https://img2.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg" width="100"/>
# askURL(baseurl)
findLink=re.compile(r'<a href="(.*?)">')#创建正则表达式对象,表示规则(字符串模式)
findImgSrc=re.compile(r'<img alt.*src="(.*?)"" width="100"/>',re.S)#让换行符包含在字符中
findTitle=re.compile(r'<span class="title">(.*?)</span>',re.S)
findRating=re.compile(r'<span class="rating_num" property="v:average">(.*?)</span>',re.S)
findJudge=re.compile(r'<span>(%d*)人评价</span>')
findInq=re.compile(r'<span class="inq">(.*)</span>')
findBp=re.compile(r'<p class="">(.*)</p>')
#爬取网页
def getData(baseurl):
datalist=[]
for i in range(0,1): #调用获取页面信息的函数10次
url=baseurl + str(i*25)
html=askURL(url) #保存获取到的网页源码
#2逐一解析数据
soup=BeautifulSoup(html,"html.parser")
for item in soup.find_all('div',class_="item"):
#print(item)
data=[] #保存一部电影的所有信息
item=str(item)
#获取到影片详情的超链接
link=re.findall(findLink,item) [0] #re库用来通过正则表达式来查找给定字符串
data.append(link)
imgSrc=re.findall(findImgSrc,item)[0]
data.append(imgSrc)
title=re.findall(findTitle,item)
if(len(title)==2)
ctitle=title[0]
data.append(ctitle)
return datalist
#得到制定一个URL的网页内容
def askURL(url):
head={ #模拟浏览器头部信息,向豆瓣发送消息
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36",
}#用户代理,表示告诉豆瓣服务器,我们是什么类型的机器-浏览器(本质上是告诉浏览器我们可以接收什么水平的文件内容)
req=urllib.request.Request(url,headers=head)
html=""
try:
res=urllib.request.urlopen(req)
html=res.read().decode("utf-8")
except urllib.error.URLError as e:
if hasattr(e,"code"):
print(e.code)
if hasattr(e,"reason"):
print(e.reason)
return html
#保存数据
def saveData(savepath):
print("djf")
if __name__ == "__main__": #当程序执行时
main()
#调用函数