先放完整代码,再分函数解释
import re
import urllib.request
from bs4 import BeautifulSoup
import random
import xlwt
import time
def main():
url = #先去把top250的网页拿来,放在""中
get_url(url)
get_data(url)
save_data(datalist=get_data(url),savepath="D:\谷歌下载\电影Top250.xls")
#save_data(savepath="电影Top250.db",datalist=get_data(url)) #这是保存到数据库
def get_url(url):
head={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"}
request = urllib.request.Request(headers=head,url=url)
response = urllib.request.urlopen(request)
html = response.read().decode('utf-8')
return html
def get_data(url):
datalist=[]
for i in range (0,10):
baseurl = url + str(i*25)
html = get_url(baseurl)
html = BeautifulSoup(html,"html.parser")
time.sleep(random.randint(0,3))
for item in html.find_all('div',class_="item"):
data = []
#print(item)
item = str(item)
#链接
link = re.findall(r'<a href="(.*?)">',item)[0] #链接
data.append(link)
#图片
src = re.findall(r'<img.*src="(.*?)" width="100"/>',item)[0]
data.append(src)
#电影名
name = re.findall(r'<span class="title">(.*?)</span>',item)
if len(name) ==2 :
cname = name[0]
data.append(cname)
fname = name[1].replace("\xa0/\xa0","")
data.append(fname)
else:
cname = name[0]
data.append(cname)
data.append(" ")
#评分
rating = re.findall(r'<span class="rating_num" property="v:average">(.*?)</span>',item)[0]
data.append(rating)
#评价人数
count_number = re.findall(r'<span>(.*?)人评价</span>',item)[0]
data.append(count_number)
#一句话评价
findevalute = re.compile(r'<span class="inq">(.*)</span>',re.S)
evaluate = re.findall(findevalute,item)
if len(evaluate) ==0:
data.append(" ")
else:
data.append(evaluate[0])
#相关信息
findre = re.compile(r'<p class="">(.*?)</p>',re.S)
relative = re.findall(findre,item)[0]
# relative = re.sub(r'\n '," ",relative) #去掉<br/>
relative = re.sub('\xa0\xa0\xa0'," ",relative) #替换/
# relative = re.sub(r'...<br/>\n '," ",relative)
# relative = re.sub(r'')
relative = re.sub('...<br/>\n '," ",relative) #去掉<br/>
relative = re.sub('/'," ",relative)
data.append(relative.strip())
datalist.append(data)
#print(datalist)
return datalist
def save_data(datalist,savepath):
book = xlwt.Workbook(encoding='utf-8',style_compression=0)
sheet = book.add_sheet("top250",cell_overwrite_ok=1)
col=["链接","图片链接","中文名","外文名","评分","评价人数","一句话评价","相关信息"]
for i in range(0,8):
sheet.write(0,i,col[i])
#print(datalist)
for i in range(0,250):
data_list = datalist[i]
#print(data_list)
for j in range(0,8):
sheet.write(i+1,j,data_list[j])
book.save(savepath)
'''
def save_sql(savepath):
conn = sqlite3.connect(savepath)
sql = '''
create table top250(
id integer primary key autoincrement,
lianjie text,
tupianlianjie text,
name varchar,
fname varchar,
pingfen numeric,
rated numeric,
inq text,
relative text
)
'''
cursor = conn.cursor()
cursor.execute(sql)
conn.commit()
conn.close()
def save_data(savepath,datalist):
save_sql(savepath)
conn = sqlite3.connect(savepath)
cursor = conn.cursor()
for data in datalist:
for index in range(len(data)):
data[index] = '"'+ data[index] +'"'
sql='''
insert into top250(lianjie,tupianlianjie,name,fname,pingfen,rated,inq,relative)
values (%s
)
'''%",".join(data)
cursor.execute(sql)
conn.commit()
conn.close()
'''
if __name__ == "__main__":
main()
print("爬取完成")
main函数
在这调用get_url,get_data,save_data仨函数,同时给出第一页的网址(去top250翻页试试,就会发现网址每翻一页,url最后的数字就会多25)
get_url函数
这里用的get方法获取网页源码,你可以暂时不管什么是get方法。往下说,head是讲自己包装成一个电脑去访问这个网页,head这句话里面的内容你可能和我不一样,这句话来自网页,你打开一个网页按F12,点network,现在这里是空白,现在在左边网页右键重新加载,然后马上点右边网页很显眼的那个红点,下面那条长线就会停止加载,鼠标左键这条长线最左边,你就会看到你的user-agent。
把useragent后面的信息复制并替换到上面代码中,这句话是让网页以为你是用这台电脑访问它,而非python。不加这句话运行后面代码会报404错误,即网页识别出了你是个爬虫
request是申请访问网页,response是网页给你的回应,html是读取网页返回给你的源码,最后return html,以便后面执行
get_data函数
在get_url中获得了源码,在这里就循环访问每一页并把源码中我们需要的的数据提取出来并加到datalist这个列表中。beautifulsoup美味汤是解析库,让源码看起来整齐些。re是正则表达式库,re.compile是匹配模式,re.findall是按匹配模式查找。
这里面有两个if else循环是因为html中信息是不工整的,比如有的电影有外文名有的没有,那我们就需要把外文名为空的那个位置留出来,以便excel排列不错乱
save_data函数
将get_data中datalist中的数据循环保存到excel表格
关于保存到数据库
把main函数的那条注释打开并关闭保存到excel的那条语句;再把下面’‘’ ‘’'注释的地方打开就行
if name == “main”:
程序入口,就像学校大门,进学校要进大门,从这运行程序便于调试;但将此文件作为包调入其他文件,这句话下面的代码不会在别处运行。