纪念自学Python以来,第一个成功自己写作的爬虫程序……。
导入请求
from lxml导入树
BASE_DOMAIN='http://dytt8.net '
HEADERS={
'用户代理' : ' Mozilla/5.0 (windows nt 10.0; 双赢64; x64 ) appleWebKit/537.36(khtml,like Gecko ) '
' chrome/68.0.3440.106 safari/537.36 ',
' referer ' : ' http://dytt8. net/html/gndy/dyzz/list _ 23 _2. html '
}
efget_detail_URLS(URL ) :
''''
获取电影天堂一页上所有电影的详细页面
:param url:来源(电影天堂首页或n页) ) ) ) ) ) ) ) ) )。
:return:返回所有详细页面地址的列表
''''
# URL=' http://dytt8. net/html/gndy/dyzz/list _ 23 _1. html '
response=requests.get(URL,headers=HEADERS ) )。
# gbk报告错误,无视错误进行解码
text=response.content.decode (' gbk ',' ignore ' ) )。
html=etree.html (文本)
e tails _ URLs=html.XPath (/table (@ class=' TB span ' )/a/@href () ) ) ) ) ) ) ) )
all_details_urls=[]
for details _ urlin details _ URLs :
if ' index.html ' in details _ URL :
传球
else:
link=BASE_DOMAIN details_url
all_details_urls.append(link )
return all_details_urls
efparse_detail_page(URL ) :
''''
解析电影详细页面的信息
:param url:具体电影详细地址
:return:返回分析后的电影信息词典
''''
movies={}
response=requests.get(URL,headers=HEADERS ) )。
text=response.content.decode (' gbk ',' ignore ' ) )。
html=etree.html (文本)
获取title=html.XPath((/H1/font ) ) color='#07519a ' )/text ) (0) )标题
的画板_element=html.XPath((/div ) id='义气红牛') )0) )获取慈爱的画板元素
imgs=温柔画板_element.XPath('.//img/@src ' ) #获取海报和电影截图
movie_poster=imgs[0] #获得电影海报
iflen(imgs ) 1:
movie_screenshot=温柔画板_element.XPath('./img/@src ' ) [1] #获取电影截图
else:
movie_screenshot='没有电影截图'
movie_infos=温柔的画板_element.XPath('.//text ) )
movie_download_url=温柔画板_ element.XPath ('./TD [ @ bgcolor=' # fdfd df ' ]/a/@ href ' )获取下载链接
movies[ '电影名称' ]=title
movies[ '电影海报' ]=movie_poster
movies[ '电影截图' ]=movie_screenshot
for i,infoinenumerate(movie_infos,0 ) :
ifinfo.startswith ()年代) ) :
info=info.replace('年代','').strip(#str.strip ) )方法是一种消除字符串开头和结尾空格的方法,在此正好使用。
movies[ '放映时间' ]=info
Elifinfo.Startswith ()产地) ) :
info=info.replace((产地)、() ) ) ) ) # str.strip () ) )方法是去除字符串开头和结尾的空格,现在正好使用。
movies[ '电影产地' ]=info
Elifinfo.startswith ()类别) :
info=info.replace('类别”,“”).strip(#str.strip ) )方法正好用于删除字符串开头和结尾的空格。
movies[ '电影类型' ]=info
Elifinfo.Startswith ()豆瓣评分) ) :
info=info.replace((豆瓣评分)、() ) ) ) ) # str.strip ) ) )方法是去除字符串头尾和尾部的空间,在此正好使用。
movies[ '电影评估' ]=info
Elifinfo.Startswith ()片长) :
info=info.replace((片长)、() ) ) ) ) # str.strip ) ) )方法用于此处,因为它消除了字符串的头部和尾部空间。
movies[ '电影长' ]=info
Elifinfo.Startswith ()导演) ) :
info=info.replace((监督)、() ) ) ) )。
movies[ '电影导演' ]=info
Elifinfo.Startswith ()主演) :
starring=[]
forxinrange(I,Len ) movie_infos ) ) :
ifmovie_infos[x].startswith ()个人资料) : # )到达个人资料后,代表主演清单的结束,结束循环
布雷克
starring.append (movie _ infos [ x ].replace ) )主演)、() ) )、strip ) )
movies[ '电影主演' ]=str.join('n ',starring ) #用join将主演列表转换为字符串
Elifinfo.startswith ()个人资料) ) :
info=movie_infos[I1].strip(#配置文件保存在当前下标的下一个位置
movies[ '电影简介' ]=info
movies[ '迅雷下载' ]=movie_download_url
返回移动
defspider(:
target_pages=input ('请输入要爬的页数:')
#至少应该爬第一页。
if target_pages.isdigit () :
target_pages=int(target_pages )
if target_pages=2:
target_pages=target_pages 1
else:
target_pages=2
打印(target _ pages )
base _ URL=' http://dytt8. net/html/gndy/dyzz/list _ 23 _ { }.html ' #使用占位符确定第几页
forIinrange(1,target_pages ) :
打印('=' * 80 ) ) ) ) )。
print(……现在正在爬页面。 稍后……spiderisworking…………(格式(I ) )
打印('=' * 80 ) ) ) ) )。
URL=base_URL.format(I )
detail _ URLs=get _ detail _ URLs (URL )
for detail _ urlin detail _ URLs :
movies=parse _ detail _ page (detail _ URL )
for key,value in movies.items () :
打印(密钥,值)。
if __name__=='__main__':
spider () )