网址:豆瓣电影 Top 250
目录
一.bs4和re正则爬取
二.xpath爬取
?
一.bs4和re正则爬取
源代码:
import urllib.request,urllib.error
import re
from bs4 import BeautifulSoup
import xlwt
baseurl = "https://movie.douban.com/top250?start="
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"
}
title = re.compile('<span class="title">(.*?)</span>') #标题
link = re.compile('<a class="" href="(.*?)"') #电影链接
introduction = re.compile('<span class="inq">(.*?)</span>') #电影简介
appraise = re.compile('<span>(.*?)</span>') #评价人数
basedata = [] #最后写入到excel中,利用列表来写入
workbook = xlwt.Workbook(encoding='utf-8') #新建excel文档
worksheet = workbook.add_sheet('daoban') #excel文档中添加表格
for i in range(0,10):
url = url = baseurl+str(i*25)
#请求网页
request = urllib.request.Request(url=url,headers=head)
#得到网页回应并打开
response = urllib.request.urlopen(request)
#对打开的网页回应并解码到utf-8(有中文)
html = response.read().decode("utf-8")
# print(html) #字符类型的html
soup = BeautifulSoup(html,"html.parser") #后面是html。parser 解析器
for item in soup.find_all('div',class_="info"):
item = str(item)
data = [] #每一部电影有多个,每部电影放入一个列表中
ftitle = re.findall(title,item)
if len(ftitle) == 2:
etitle = ftitle[0]
data.append(etitle)
rtitle = ftitle[1].replace("/","")#去点无关符号
data.append(rtitle)
else:
data.append(ftitle[0])
data.append(' ')#外国名留空 #有的会没有外国电影,防止串行
flink = re.findall(link,item)[0]
data.append(flink)
# print(data)
# fintroduction = re.findall(introduction,item)[0]#有的电影没有概述
fintroduction = re.findall(introduction, item)
if len(fintroduction) != 0:
fintroduction = fintroduction[0].replace("。","")#取代最后面的句号
data.append(fintroduction)
else:
data.append(" ")
data.append(fintroduction)
fappraise = re.findall(appraise,item)[0]
data.append(fappraise)
basedata.append(data) #单个电影信息的列表加入到一个大列表中
for i in range(0,250):
print("第%d条记录"%i)
first = basedata[i]
for j in range(0,4):
second = first[j]
worksheet.write(i,j,second) #每个列表中保存数据
workbook.save('豆瓣.xls') #保存excel文档
print(basedata)
1.请求网页并且获取网页源代码的代码实现:
import urllib.request,urllib.error
baseurl = "https://movie.douban.com/top250?start="
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"
}
#for循环来进行页面跳转
for i in range(0,10):
url = url = baseurl+str(i*25)
#请求网页
request = urllib.request.Request(url=url,headers=head)
#得到网页回应并打开
response = urllib.request.urlopen(request)
#对打开的网页回应并解码到utf-8(有中文)
html = response.read().decode("utf-8")
# print(html)
2.对拿到的源代码的取其中的想要的电影标题,链接等
import urllib.request,urllib.error
import re
from bs4 import BeautifulSoup
baseurl = "https://movie.douban.com/top250?start="
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"
}
title = re.compile('<span class="title">(.*?)</span>') #标题
link = re.compile('<a class="" href="(.*?)"') #电影链接
introduction = re.compile('<span class="inq">(.*?)</span>') #电影简介
appraise = re.compile('<span>(.*?)</span>') #评价人数
basedata = [] #最后写入到excel中,利用列表来写入
for i in range(0,10):
url = url = baseurl+str(i*25)
#请求网页
request = urllib.request.Request(url=url,headers=head)
#得到网页回应并打开
response = urllib.request.urlopen(request)
#对打开的网页回应并解码到utf-8(有中文)
html = response.read().decode("utf-8")
# print(html) #字符类型的html
soup = BeautifulSoup(html,"html.parser") #后面是html。parser 解析器
for item in soup.find_all('div',class_="info"):
item = str(item)
data = [] #每一部电影有多个,每部电影放入一个列表中
ftitle = re.findall(title,item)
if len(ftitle) == 2:
etitle = ftitle[0]
data.append(etitle)
rtitle = ftitle[1].replace("/","")#去点无关符号
data.append(rtitle)
else:
data.append(ftitle[0])
data.append(' ')#外国名留空 #有的会没有外国电影,防止串行
flink = re.findall(link,item)[0]
data.append(flink)
# print(data)
# fintroduction = re.findall(introduction,item)[0]#有的电影没有概述
fintroduction = re.findall(introduction, item)
if len(fintroduction) != 0:
fintroduction = fintroduction[0].replace("。","")#取代最后面的句号
data.append(fintroduction)
else:
data.append(" ")
data.append(fintroduction)
fappraise = re.findall(appraise,item)[0]
data.append(fappraise)
basedata.append(data) #单个电影信息的列表加入到一个大列表中
print(basedata)
3.对拿到的数据写道excle当中
import urllib.request,urllib.error
import re
from bs4 import BeautifulSoup
import xlwt
baseurl = "https://movie.douban.com/top250?start="
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"
}
title = re.compile('<span class="title">(.*?)</span>') #标题
link = re.compile('<a class="" href="(.*?)"') #电影链接
introduction = re.compile('<span class="inq">(.*?)</span>') #电影简介
appraise = re.compile('<span>(.*?)</span>') #评价人数
basedata = [] #最后写入到excel中,利用列表来写入
workbook = xlwt.Workbook(encoding='utf-8') #新建excel文档
worksheet = workbook.add_sheet('daoban') #excel文档中添加表格
for i in range(0,10):
url = url = baseurl+str(i*25)
#请求网页
request = urllib.request.Request(url=url,headers=head)
#得到网页回应并打开
response = urllib.request.urlopen(request)
#对打开的网页回应并解码到utf-8(有中文)
html = response.read().decode("utf-8")
# print(html) #字符类型的html
soup = BeautifulSoup(html,"html.parser") #后面是html。parser 解析器
for item in soup.find_all('div',class_="info"):
item = str(item)
data = [] #每一部电影有多个,每部电影放入一个列表中
ftitle = re.findall(title,item)
if len(ftitle) == 2:
etitle = ftitle[0]
data.append(etitle)
rtitle = ftitle[1].replace("/","")#去点无关符号
data.append(rtitle)
else:
data.append(ftitle[0])
data.append(' ')#外国名留空 #有的会没有外国电影,防止串行
flink = re.findall(link,item)[0]
data.append(flink)
# print(data)
# fintroduction = re.findall(introduction,item)[0]#有的电影没有概述
fintroduction = re.findall(introduction, item)
if len(fintroduction) != 0:
fintroduction = fintroduction[0].replace("。","")#取代最后面的句号
data.append(fintroduction)
else:
data.append(" ")
data.append(fintroduction)
fappraise = re.findall(appraise,item)[0]
data.append(fappraise)
basedata.append(data) #单个电影信息的列表加入到一个大列表中
for i in range(0,250):
print("第%d条记录"%i)
first = basedata[i]
for j in range(0,4):
second = first[j]
worksheet.write(i,j,second) #每个列表中保存数据
workbook.save('豆瓣.xls') #保存excel文档
print(basedata)
二.xpath爬取
这个我自己使用了几次,好像相比上面那个,更容易被拉黑,谨慎使用吧。
ps:1.好像加上time.sleep(1)可以减缓爬取速度并且不容易被拉黑(需要(import time)导入包)
? ? ? ? 2.请求打开网页最后要关闭网页(requ.close())
? ? ? ? ?
源代码:
import requests
from lxml import etree
import xlwt
workbook = xlwt.Workbook(encoding='utf-8') #新建一个excel文档
worksheet = workbook.add_sheet('daoban')
data = [] #需要把所有数据放在一个列表中,然后再写入到excel中
baseurl = "https://movie.douban.com/top250?start="
head = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.40"
}
for i in range(0,10):
changeurl = baseurl + str(25*i)
requ = requests.get(url=changeurl,headers=head) #请求网页数据
html1 = requ.text #拿到字符类型的网页源代码
html = etree.HTML(html1) #转换成可以使用xpath的类型
div = html.xpath('/html/body/div[3]/div[1]/div/div[1]/ol/li')
print(html1)
try:
for item in div:
basedata = [] #要把每一部电影的各个信息分开保存,且一个电影为一个小列表
ftitle = item.xpath('./div/div[2]/div[1]/a/span[1]/text()')[0] #最后加上text()来获取到文本内容,再加[0]放入列表第一个元素
basedata.append(ftitle)
flink = item.xpath('./div/div[2]/div[1]/a/@href')[0] #最后加上/@href是取节点<a中的href中的内容
basedata.append(flink)
fintroduction = item.xpath('./div/div[2]/div[2]/p[2]/span/text()') #不是所有的都有简介,所以给一个判断看是否存在,不存在的时候添加空格来占个位置
if len(fintroduction) != 0:
basedata.append(fintroduction)
else:
basedata.append(' ')
basedata.append(fintroduction)
data.append(basedata)
except(IndexError) as e:
pass
requ.close()
# 上面把250条记录都保存再同一个列表中,现在写入到excel
for i in range(0,250):
first = data[i]
for j in range(0,3):
second = first[j]
worksheet.write(i,j,second)
workbook.save('豆瓣T250.xls')
print(data)
1.请求网页并且获取网页源代码的代码实现:
import requests
baseurl = "https://movie.douban.com/top250?start="
head = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.40"
}
for i in range(0,10):
changeurl = baseurl + str(25*i)
requ = requests.get(url=changeurl,headers=head) #请求网页数据
html1 = requ.text #拿到字符类型的网页源代码
#print(html1) #检查是否拿到了源代码
2.对拿到的源代码的取其中的想要的电影标题,链接等
import requests
from lxml import etree
data = [] #需要把所有数据放在一个列表中,然后再写入到excel中
baseurl = "https://movie.douban.com/top250?start="
head = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.40"
}
for i in range(0,10):
changeurl = baseurl + str(25*i)
requ = requests.get(url=changeurl,headers=head) #请求网页数据
html1 = requ.text #拿到字符类型的网页源代码
html = etree.HTML(html1) #转换成可以使用xpath的类型
div = html.xpath('/html/body/div[3]/div[1]/div/div[1]/ol/li')
print(html1)
try:
for item in div:
basedata = [] #要把每一部电影的各个信息分开保存,且一个电影为一个小列表
ftitle = item.xpath('./div/div[2]/div[1]/a/span[1]/text()')[0] #最后加上text()来获取到文本内容,再加[0]放入列表第一个元素
basedata.append(ftitle)
flink = item.xpath('./div/div[2]/div[1]/a/@href')[0] #最后加上/@href是取节点<a中的href中的内容
basedata.append(flink)
fintroduction = item.xpath('./div/div[2]/div[2]/p[2]/span/text()') #不是所有的都有简介,所以给一个判断看是否存在,不存在的时候添加空格来占个位置
if len(fintroduction) != 0:
basedata.append(fintroduction)
else:
basedata.append(' ')
basedata.append(fintroduction)
data.append(basedata)
except(IndexError) as e:
pass #这里使用try excep 异常处理是有的简介之类的没有,添加如上的判读之后就可以不用写try了
requ.close()
print(data) #检查是否拿到了想要的数据
3.对拿到的数据写道excle当中
import requests
from lxml import etree
import xlwt
workbook = xlwt.Workbook(encoding='utf-8') #新建一个excel文档
worksheet = workbook.add_sheet('daoban')
data = [] #需要把所有数据放在一个列表中,然后再写入到excel中
baseurl = "https://movie.douban.com/top250?start="
head = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.40"
}
for i in range(0,10):
changeurl = baseurl + str(25*i)
requ = requests.get(url=changeurl,headers=head) #请求网页数据
html1 = requ.text #拿到字符类型的网页源代码
html = etree.HTML(html1) #转换成可以使用xpath的类型
div = html.xpath('/html/body/div[3]/div[1]/div/div[1]/ol/li')
print(html1)
try:
for item in div:
basedata = [] #要把每一部电影的各个信息分开保存,且一个电影为一个小列表
ftitle = item.xpath('./div/div[2]/div[1]/a/span[1]/text()')[0] #最后加上text()来获取到文本内容,再加[0]放入列表第一个元素
basedata.append(ftitle)
flink = item.xpath('./div/div[2]/div[1]/a/@href')[0] #最后加上/@href是取节点<a中的href中的内容
basedata.append(flink)
fintroduction = item.xpath('./div/div[2]/div[2]/p[2]/span/text()') #不是所有的都有简介,所以给一个判断看是否存在,不存在的时候添加空格来占个位置
if len(fintroduction) != 0:
basedata.append(fintroduction)
else:
basedata.append(' ')
basedata.append(fintroduction)
data.append(basedata)
except(IndexError) as e:
pass
requ.close()
# 上面把250条记录都保存再同一个列表中,现在写入到excel
for i in range(0,250):
first = data[i]
for j in range(0,3):
second = first[j]
worksheet.write(i,j,second)
workbook.save('豆瓣T250.xls')
print(data)
PS:单独的新建excel文档,写入内容并保存的代码实现
import xlwt
workbook = xlwt.Workbook(encoding='utf-8') #新建一个excel文档
worksheet = workbook.add_sheet('daoban') #excel中新建单个表格名字为:douban
worksheet.write(5,4,hello python) #在表格中的第(5,4)位置添加内容:hello python
workbook.save('hello.xls') #保存excel文档的名字为hello.xls
|