python3[爬虫基础入门实战] 爬取豆瓣电影排行top250
2017-06-24 23:59
1286 查看
先来张爬取结果的截图
再来份代码吧
# encoding=utf8 import requests import re from bs4 import BeautifulSoup from tkinter import scrolledtext # 导入滚动文本框的模块 from tkinter import ttk import tkinter as tk import threading # 获取网页内容 def getHtml(ID): url = 'https://movie.douban.com/top250?start=%s&filter=' % ID print('url ' + url) headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.2372.400 QQBrowser/9.5.10548.400' , 'Cookie': 'bid=I0klBiKF3nQ; ll="118277"; gr_user_id=ffdf2f63-ec37-49b5-99e8-0e0d28741172; ap=1; _vwo_uuid_v2=8C5B24903B1D1D3886FE478B91C5DE97|7eac18658e7fecbbf3798b88cfcf6113; _pk_ref.100001.4cf6=%5B%22%22%2C%22%22%2C1498305874%2C%22https%3A%2F%2Fbook.douban.com%2Ftag%2F%25E9%259A%258F%25E7%25AC%2594%3Fstart%3D20%26type%3DT%22%5D; _pk_id.100001.4cf6=4e61f4192b9486a8.1485672092.5.1498306809.1498235389.; _pk_ses.100001.4cf6=*' } req = requests.get(url, headers) return req.text # 解析网页并且获取相应内容 def parseHtml(html): # soup = BeautifulSoup(html,'lxml') # 现在改为用正则 print('init html.....') # print(html) # 1 取出title # titleRe = r'<span class="title">(.*?)</span>' titleRe = r'<span class="title">(.[^&]*?)</span>' # 这里除去了副标题,(根据  空格号进行筛选) regTitle = re.compile(titleRe) titleStr = re.findall(regTitle, html) # print(titleStr) # for verTitle in titleStr: # print(verTitle) # 2 取出评分 retStars = r'.*?"v:average">(.*?)</span>' regStars = re.compile(retStars) starts = re.findall(regStars, html) # print(starts) # 取出评价 regCommend = r'<span>(.*?)</span>' regCommends = re.compile(regCommend) commends = [] commends = re.findall(regCommends, html) # print(commends) commends.remove('·') commends.remove('更多') commends.remove('{{= year}}') commends.remove('{{= sub_title}}') commends.remove('{{= address}}') commends.remove('集数未知') commends.remove('共{{= episode}}集') # print(commends) # 取出导演,剧情(未实现) # regDoc= r'.*?<p class>(.*?)<br>' # regxDoc = re.compile(regDoc) # list_doc = re.findall(regxDoc,html) # print(list_doc) # print('*'*40) # 片言(未实现) # regAction = r'<p class>.*?<br>(.*?)</p>' # regx_action = re.compile(regAction) # list_action = re.findall(regx_action,html) # print(list_action) # 取出引言 希望让人自由 regScrip = r'.*?"inq">(.*?)</span>' regx_scrip = re.compile(regScrip) list_scrip = re.findall(regx_scrip, html) # print(list_scrip) # 取出图片地址(未实现) # regImg = r'<div class="pic">.*?src= "(.*?)"' # regx_img = re.compile(regImg) # list_imgaddress = re.findall(regx_img,html) # print(list_imgaddress) ver_info = list(zip(titleStr, commends, list_scrip)) return ver_info # html = getHtml(0) # ver_infos = parseHtml(html) # print(ver_infos) def write(): print('开始爬取内容') ID = 0 nums = 0 while ID < 250: html = getHtml(ID) ver_infos = parseHtml(html) ID += 25 for ver in ver_infos: varStr = 'No.%d\t%-30s%s\t(描述:)%-30s' % (nums, ver[0], ver[1],ver[2]) print(varStr) nums += 1 print('爬取成功'+str(nums)) def start(): print('start init ....') t1 = threading.Thread(target=write()) t1.start() start() # 以下方法丢弃 # def save(): # print('save init ...') # content = name.get() # textFile = open(u'C:\\豆瓣电影排行250.txt') # textFile.write(content) # textFile.close() # # print('^'*40) # win = tk.Tk() # win.title('呵呵呵') # # # 滚动文本框 # scrolW = 30 # 设置文本框的长度 # scrolH = 3 # 设置文本框的高度 # scr = scrolledtext.ScrolledText(win, width=scrolW, height=scrolH, wrap=tk.WORD) # wrap=tk.WORD 这个值表示在行的末尾如果有一个单词跨行,会将该单词放到下一行显示,比如输入hello,he在第一行的行尾,llo在第二行的行首, 这时如果wrap=tk.WORD,则表示会将 hello 这个单词挪到下一行行首显示, wrap默认的值为tk.CHAR # scr.grid(column=0, columnspan=3) # # # 文本框 # name = tk.StringVar() # StringVar是Tk库内部定义的字符串变量类型,在这里用于管理部件上面的字符;不过一般用在按钮button上。改变StringVar,按钮上的文字也随之改变。 # nameEntered = ttk.Entry(win, width=42, textvariable=name) # 创建一个文本框,定义长度为12个字符长度,并且将文本框中的内容绑定到上一句定义的name变量上,方便clickMe调用 # nameEntered.grid(column=0, row=4) # 设置其在界面中出现的位置 column代表列 row 代表行 # nameEntered.focus() # 当程序运行时,光标默认会出现在该文本框中 # # # 添加开始按钮 # start = ttk.Button(win,text='开始',command=start()) # start.grid(column=0,row=0) #按钮的添加位置 # # # 保存按钮 # save = ttk.Button(win,text='保存',command=save()) # save.grid(column=1,row=0) # # win.mainloop()
这次用的是正则来获取内容的,有两个字段在正则上卡住了, 问了群里也没有人回,就暂且写到这吧。 还是获取的静态html的页面。
遇到的知识点:
正则的简单写法:例如
regCommend = r'<span>(.*?)</span>'
# 取出引言 希望让人自由 regScrip = r'.*?"inq">(.*?)</span>'
集合的去掉不要的元素:
commends.remove('·') commends.remove('更多') commends.remove('{{= year}}') commends.remove('{{= sub_title}}') commends.remove('{{= address}}') commends.remove('集数未知') commends.remove('共{{= episode}}集')
整理成一条信息:
ver_info = list(zip(titleStr, commends, list_scrip))
用了一个线程爬取,我也不知道这是单线程爬取,反正是第一次加入吧。
t1 = threading.Thread(target=write()) t1.start()
今天晚上用的最多的时间是GUI方面
过程:
本来数据在正则那稍微花了点时间,但是在GUI方面花的却是很长时间,搞的自己蒙圈了。在这里应该给自己提一个醒,东西一次性不要学太多,一个一个慢慢的学 虽然 一次性学的东西不会很多,但是学的印象会深刻很多。所以,归总一下,这次学的算是上面的几点吧,主要是现在是敢要正则这玩意了, 虽然用的很浅,但是,现在是对python3 不那么陌生。之前是一个都搞不出来。现在是稍微有点 入门的感觉,离自己想要的还有很长很长的路啊。。
总结:
下次练习,我也暂时不知道做什么,这些例子都是从网上给照过来的, 然后自己稍微跟着自己的感觉走一下,网上找的例子也不知道是2.x 还是3.x的,结果到后来才发现, 是2.x 的, 只是感觉蛋疼。无语。今晚虽然花的时间比较多,但是效果还是挺不错的。好好学习,加把劲。
喜欢的可以给我点个赞,让我知道你也因为你的梦想路过这里。
相关文章推荐
- Python爬虫实战——豆瓣电影top250
- [python爬虫入门]爬取豆瓣电影排行榜top250
- Python爬虫实战——豆瓣电影Top250
- 实践Python的爬虫框架Scrapy来抓取豆瓣电影TOP250
- Python爬虫初学(1)豆瓣电影top250评论数
- scrapy入门实战练习(一)----爬取豆瓣电影top250
- python3 [入门基础实战] 爬虫入门之爬取豆瓣阅读中文电子书[热门排序]
- [Python/爬虫]利用xpath爬取豆瓣电影top250
- Python爬虫实战(一):爬取豆瓣电影top250排名
- 1.【python爬虫学习笔记】爬取豆瓣电影top250
- Python 3爬虫小实战(一)—— 豆瓣电影Top250
- python 爬虫实战(一)爬取豆瓣图书top250
- python3--爬虫实战一:爬取豆瓣电影250
- 实践Python的爬虫框架Scrapy来抓取豆瓣电影TOP250
- (7)Python爬虫——爬取豆瓣电影Top250
- [置顶] python爬虫实践——零基础快速入门(二)爬取豆瓣电影
- Python爬虫——豆瓣电影Top250
- python爬虫 Scrapy2-- 爬取豆瓣电影TOP250
- [python爬虫] BeautifulSoup和Selenium对比爬取豆瓣Top250电影信息
- Python爬虫获取豆瓣电影TOP250