python里面有很多操作都类似于c语言,这里在爬取时主要需要注意用到的是for循环语句和各种库。
个人认为python中主要还是对库的运用比较占大比例。
(这里的软件版本是PyCharm 2020.3.2 x64)
所以,在爬取前先把这里所需要用到的库展示出来:
from bs4 import BeautifulSoup
import sys
import xlwt
import re
import urllib
import urllib.request
import urllib.error
import sqlite3
这里最后一个不在此次运用范围内,但是可以用其进行存储数据,本文选用的是用excel存储数据。
一. 整理架构
1,爬取网页
2,解析数据
3,保存数据
if _ _ name _ _ =="_ _ main _ _": 这个相当于int main()表示程序首先从这里进行,与此同时若是前面有顶格写的,则依旧是先从顶格写的开始写。
这里print()先执行,后面再执行if······语句里面的内容。
二.库的介绍
1. BeautSoup(bs4)
BeautifulSoup是将复杂HTML文档转换成一个复杂的树形结构,每个节点都是python对象,所有对象可以归纳为四种
–tag
–NavigableString
–BeautifulSoup
–Comment
原理:
from bs4 import BeautifulSoup
import re
file = open("./bs4使用.html","rb")
html = file.read().decode("utf-8")
bs = BeautifulSoup(html,"html.parser")
print(bs.title)
print("****")
print(bs.title.string)
该代码显示:
提取指定内容:
print(bs.a)
print(bs.head)
print(type(bs.head))
最终显示:
文档遍历,搜索,正则表达式搜索:
print(bs.head.contents)
print(bs.head.contents[1])
t_list = bs.find_all("a")
t_list = bs.find_all(re.compile("a"))
2.Urllib
制定URL,获取网页数据,访问url
内部原理:
(1).获得get请求(本文print用来查看该步骤是否进行或进行是否正确)
import urllib.request
response = urllib.request.urlopen("http://www.baidu.com")
print(response.read().decode('utf-8'))
其中这里urlopen,这个函数就是请求一个url的内容,这也是爬虫的第一步:网页请求,获取内容
(2).获取post请求
import urllib.parse
data = bytes(urllib.parse.urlencode({"hello":"world"}),encoding="utf-8")
response = urllib.request.urlopen("http://httpbin.org/post",data=data)
print(response.read().decode('utf-8'))
这里加了data参数就是以POST形式发送请求,否则就是GET方式了。
3.RE正则表达
用正则表达来获取想要的信息,提取数据。
这里用代码来展示:
import re
pat=re.compile("AA")
flag=pat.search("454adaAAAAA")
print(flag)
m = re.search("ads","sdsjhiadsj")
print(m)
print(re.findall("a","dfuahhfuuafa"))
print(re.findall("[a-z]","ahu54QFG5ds"))
print(re.sub("a","A","AFfsdfsAAaaff"))
a=r"\aabd-\'"
print(a)
4.xwlt存储数据
简单介绍
workbook = xlwt.Workbook(encoding="utf-8")
worksheet = workbook.add_sheet('sheet1')
worksheet.write(0,0,'hello')
workbook.save('student.xls')
这里举个例子,把99乘法表放入excel表格里:
import xlwt
workbook = xlwt.Workbook(encoding="utf-8")
worksheet = workbook.add_sheet('sheet1')
for i in range(0,9):
for j in range(0,i+1):
worksheet.write(i,j,"%d * %d = %d"%(i+1,j+1,(i+1)*(j+1)))
workbook.save('99乘法表.xls')
可以在旁边的列表栏里找到建立的文档,打开后如下:
三.分步拆解
Ⅰ,主函数,囊括所有步骤
def main():
baseurl = "https://movie.douban.com/top250?start="
datalist = getdata(baseurl)
savepath = ".\\豆瓣电影Top250.xls"
savedata(datalist,savepath)
Ⅱ,爬取网页
def getdata(baseurl):
datalist = []
for i in range(0,10):
url = baseurl + str(i*25)
html = askURL(url)
soup = BeautifulSoup(html,"html.parser")
for item in soup.find_all('div',class_="item"):
data = []
item = str(item)
link = re.findall(findlink,item)[0]
data.append(link)
imgsrc=re.findall(findimgsrc,item)[0]
data.append(imgsrc)
titles=re.findall(findtitile,item)
if(len(titles) == 2):
ctitle = titles[0]
data.append(ctitle)
etitile = titles[1].replace("/","")
data.append(etitile)
else:
data.append(titles[0])
data.append(' ')
rating = re.findall(findrating,item)[0]
data.append(rating)
judge = re.findall(findjudge,item)[0]
data.append(judge)
inq = re.findall(findinq,item)
if len(inq) !=0:
inq = inq[0].replace("。","")
data.append(inq)
else:
data.append(" ")
bd = re.findall(findbd,item)[0]
bd = re.sub('<br(\s+)?/>(\s+)?'," ",bd)
bd = re.sub('/'," ",bd)
data.append(bd.strip())
datalist.append(data)
return datalist
Ⅲ,获取网页全部数据&判断是否进入网页是否成功
def askURL(url):
head = {
"User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Mobile Safari/537.36"
}
request = urllib.request.Request(url,headers=head)
html = ""
try:
response = urllib.request.urlopen(request)
html = response.read().decode('utf-8')
except urllib.error.URLError as e:
if hasattr(e,"b"):
print(e.b)
if hasattr(e,"n"):
print(e.n)
return html
Ⅳ,保存数据
def savedata(datalist,savepath):
print("save....")
book = xlwt.Workbook(encoding="utf-8",style_compression=0)
sheet = book.add_sheet('豆瓣电影Top250',cell_overwrite_ok=True)
col = ("电影详情链接","图片链接","影片中文名","影片外国名","评分","评价人数","概况","相关信息")
for i in range(0,8):
sheet.write(0,i,col[i])
for i in range(0,250):
print("第%d条"%i)
data = datalist[i]
for j in range(0,8):
sheet.write(i+1,j,data[j])
book.save('豆瓣电影top250.xls')
Ⅴ,分类获取数据(re)
findlink = re.compile(r'<a href="(.*?)">')
findimgsrc = re.compile(r'<img.*src="(.*?)"',re.S)
findtitile = re.compile(r'<span class="title">(.*)</span>')
findrating=re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
findjudge=re.compile(r'<span>(\d*)人评价</span>')
findinq=re.compile(r'<span class="inq">(.*)</span>')
findbd=re.compile(r'<p class="">(.*)</p>',re.S)
效果显示&待补充:
1,这里获取标题的地方有两个,因为部分作品既有中文名也有英文名;
2,在我们查看数据时发现有的作品有概述,有点没有,所以我们需要判断,因此插入了if语句。
最后的效果
若有不足,欢迎指出。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)