(吼吼吼)初学爬虫 +爬取豆瓣电影
Posted 钟钟终
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(吼吼吼)初学爬虫 +爬取豆瓣电影相关的知识,希望对你有一定的参考价值。
获取豆瓣电影(完结!!)
import bs4 #网页解析,获取数据
from bs4 import BeautifulSoup
import re #正则表达式,文字匹配
import urllib.request,urllib.error #制定URL,获取网页数据
import xlwt #进行excel操作
import sqlite3 #进行SQL数据库操作
#def main():
#findlink=re.compile(r'<a href="(.*?)">')
#爬取网页
def getData(baseurl):
datalist=[]
for i in range(0,10):
url=baseurl+str(i*25)
html=askurl(url)
#逐一解析数据
soup=BeautifulSoup(html,"html.parser")
#创建BeautifulSoup对象,html为页面内容,html.parser是一种页面解析器
for item in soup.find_all('div',class_="item"):
#查找符合要求的字符串,形成列表,即页面内所有样式的item类的div
#print(item) #查看电影item全部信息(那胡来验证比较分析)
data=[] #保存一部电影所有信息
item=str(item)
#print(item)
#break 关键:提取一步影片分析格式
#下面为正则表达式
#提取影片链接
link=re.findall(re.compile(r'<a href="(.*?)">'),item)[0]
data.append(link)
#print(link)
#影片图片链接
findimg=re.compile(r'<img.*src="(.*?)"',re.S) #让换行符保安在字符中
Img=re.findall(findimg,item)[0]
data.append(Img)
#提取影片片名
findname=re.compile(r'<span class="title">(.*?)</span>',re.S)
name=re.findall(findname, item)
if len(name)==2:
cname=name[0]
data.append(cname) #添加中文名
ename=name[1].replace('/',"") #去掉五官符号
data.append(ename) #添加外文名
else:
data.append(name[0])
data.append(" ") #细节:留空
#print(name)
#影片评分
find_rate=re.compile(r'<span class="rating_num" property="v:average">(.*?)</span>',re.S)
rate=re.findall(find_rate, item)[0]
data.append(rate)
#评价人数
find_num=re.compile(r'<span>(.*?)</span>',re.S)
num=re.findall(find_num, item)[0]
data.append(num)
#找到概况
find_inq=re.compile(r'<span class="inq">(.*?)</span>',re.S)
inq=re.findall(find_inq, item)
if len(inq) !=0:
inq=inq[0]
else:
data.append(" ") #留空
data.append(inq)
#找到相关内容
find_bd=re.compile(r'<p class="">(.*?)</p>',re.S)
bd=re.findall(find_bd,item)[0]
bd=re.sub('<br(\\s+)?/>(\\s+)?'," " ,bd) #替换<br/>
bd=re.sub('/', ' ', bd) #替换/
data.append(bd.strip()) #去掉前后的空格
#把处理好的一部电影信息放入datalist
datalist.append(data)
#print(datalist)
return datalist
def askurl(url): #得到一个指定URL的网页内容
head={ #模拟浏览器头部信息,向豆瓣服务器发送消息
"User-Agent":" Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36"
}
#用户代理:表示告诉豆瓣,我们是什么类型机器
#(实质上告诉浏览器,我们可接受什么水平的文件)
request=urllib.request.Request(url,headers=head)
html=""
try:
response=urllib.request.urlopen(request)
html=response.read().decode("utf-8")
#print(html)
except urllib.error.URLError as e:
if hasattr(e,"code"):
print(e.code)
if hasattr(e, "reason"):
print(e.reason)
return html
def saveDate(datalist,savepath): #保存数据,保存到excel表
workbook=xlwt.Workbook(encoding="utf-8",style_compression=0) #创建workbook对象
workshep=workbook.add_sheet('豆瓣电影Top250.xls',cell_overwrite_ok=True) #创建工作表
col=("电影详情链接","图片链接","影片中文名","影片外国名","评分","评价数","概况","相关信息")
for i in range(0,8):
workshep.write(0,i,col[i]) #列名(属性)
for i in range(0,250):
print(f"第{i+1}条")
data =datalist[i]
for j in range(0,8):
workshep.write(i+1,j,data[j])
workbook.save('豆瓣电影Top250.xls') #保存
basurl="https://movie.douban.com/top250?start="
#爬取网页
datalist=getData(basurl)
savepath="豆瓣电影Top250.xls" #保存到当前文件系统
#askurl("https://movie.douban.com/top250?start=0")
#保存数据
saveDate(datalist,savepath)
print("爬取完毕!")
获取一个get请求
import urllib.request
response=urllib.request.urlopen("http://www.baidu.com")
#通过urllib库中的urlopen方法打开网站,获取数据返回
print(response.read().decode('utf-8'))
#防止乱码,使用decode解码(默认utf-8)
#对获取到的网页源码进行utf-8解码
获取一个post请求
import urllib.parse
#通过表单封装
data1=bytes(urllib.parse.urlencode({"hello":"world"}),encoding="utf-8") #转化为二进制,数据包
response=urllib.request.urlopen("http://httpbin.org/post",data=data1)
print(response.read().decode("utf-8"))
超时处理
try:
response=urllib.request.urlopen("http://httpbin.org/get",timeout=0.1)
print(response.read().decode("utf-8"))
except urllib.error.URLError as e:
print("Time out")'''
response=urllib.request.urlopen("https://www.bilibili.com")
print(response.getheaders())'''
伪装浏览器
url="https://httpbin.org/post"
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36"
}
data=bytes(urllib.parse.urlencode({'name':'eric'}),encoding="utf-8")
req=urllib.request.Request(url=url,data=data,headers=headers,method="POST")
response=urllib.request.urlopen(req)
print(response.read().decode("utf-8"))
爬进豆瓣网
url="https://movie.douban.com/top250"
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36"
}
req=urllib.request.Request(url=url,headers=headers)
response=urllib.request.urlopen(req)
print(response.read().decode("utf-8"))
正则表达式函数基本使用
import re
'''pat=re.compile("AAA")
m=pat.search("AAAGGFREGAAA").group() #search方法用于比对查找
print(m)
print(re.findall('a', 'reaafra')) '''
print(re.findall('[A-Z]+', 'weqGREG')) #一次找到多个符合的
#sub
print(re.sub("a", 'A', 'aregreGEA')) #找到a用A替换
# 建议在正则表达式中,被比较的字符串前面加上r,那么不用担心转义字符问题
print(r"/aeg/'")
以上是关于(吼吼吼)初学爬虫 +爬取豆瓣电影的主要内容,如果未能解决你的问题,请参考以下文章