Python爬虫项目教程(微课版)-参考答案.docx

上传人:暗伤 文档编号:82384300 上传时间:2023-03-25 格式:DOCX 页数:32 大小:128.95KB
返回 下载 相关 举报
Python爬虫项目教程(微课版)-参考答案.docx_第1页
第1页 / 共32页
Python爬虫项目教程(微课版)-参考答案.docx_第2页
第2页 / 共32页
点击查看更多>>
资源描述

《Python爬虫项目教程(微课版)-参考答案.docx》由会员分享,可在线阅读,更多相关《Python爬虫项目教程(微课版)-参考答案.docx(32页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、Python 爬虫项目教程(微课版)习题参考答案练习 11. Flask 是一个比较简单的 Python Web 开发框架,你知道 Python 还有哪些比较流行的Web 开发框架吗?说说它们的主要区别。答:企业级开发框架Django 高并发处理框架Tornado 快速建站的框架Flask底层自定义协议网络框架Twisted2. 使用 GET 方法提交数据与使用 POST 方法提交数据有什么不同?在 Flask 中如何获取提交的数据?答:Flask 获取 GET/POST 数据: flask.request.values.get(参数名称,默认值)3. 使用 Flask 编写一个 Web 程序

2、,它接收如下代码提交的 user_name 与 user_pass数据。答:import flask app=flask.Flask(web)app.route(/) def index():s=return sapp.route(/login,methods=GET,POST) def login():user_name=flask.request.values.get(user_name,) user_pass=flask.request.values.get(user_pass,) return user_name+,+user_passapp.debug=True app.run()4

3、. 说出下面正则表达式匹配的字符串分别是什么。(1)rw+s(2)rw+b(3)rd+-d+(4)rw+(w+.)+w+(5)r(b|cd)ef 答: 省略5. 使用正则表达式匹配 HTML 代码中所有形如的 JPG图像文件,找出一个网站中所有这样表示的 JPG 图像文件,并下载这些图像文件。答:import urllib.request import redef getHtml(url): html=try:resp=urllib.request.urlopen(url) data=resp.read()try:html=data.decode().lower() except:html=d

4、ata.decode(gbk).lower() except Exception as err:print(err) return htmldef parseHtml(html):32try:imgReg=r srcReg=rhttp:/.+.jpgwhile True:m=re.search(imgReg,html) if m:s=htmlm.start():m.end() n=re.search(srcReg,s) src=sn.start():n.end() download(src) html=htmlm.end():else:breakexcept Exception as err:

5、 print(err)def download(src): try:print(downloding,src) resp=urllib.request.urlopen(src) data=resp.read() p=src.rfind(/)fn=srcp+1: fobj=open(fn,wb) fobj.write(data) fobj.close() print(downloaded,fn)except Exception as err: print(err)url=.html=getHtml(url) parseHtml(html)练习 21. 简单说明Beautiful Soup 解析数

6、据的特点。答: 省略2. 用Beautiful Soup 装载下面的 HTML 文档,并以规范的格式输出,比较与原来 HTMLHiHelloEnd文档的区别,说明 Beautiful Soup 是如何修改的。答:from bs4 import BeautifulSouphtml=HiHelloEnd soup=BeautifulSoup(html,html.parser) print(soup.prettify()3. 重新编写本书项目 1 中爬取外汇网站数据的程序,使用Beautiful Soup 分解出中的数据。答:import urllib.requestfrom bs4 import

7、BeautifulSoup import sqlite3class MySpider:def openDB(self):# 初始化数据库,创建数据库 rates.db 与一张空表 rates self.con = sqlite3.connect(rates.db) self.cursor = self.con.cursor()try:self.cursor.execute(drop table rates) except:passsql = create table rates (Currency varchar(256) primary key,TSP float,CSP float, TB

8、P float, CBP float,Time varchar(256)try:self.cursor.execute(sql) except:passdef closeDB(self): # 关闭数据库mit() self.con.close()def insertDB(self, Currency, TSP, CSP, TBP, CBP, Time): # 记录插入数据库try:sql = insert into rates (Currency,TSP,CSP,TBP,CBP,Time) values (?,?,?,?,?,?)self.cursor.execute(sql, Curren

9、cy, TSP, CSP, TBP, CBP,Time)except Exception as err: print(err)def show(self): # 显示函数self.cursor.execute(select Currency,TSP,CSP,TBP,CBP,Time fromrates)rows = self.cursor.fetchall()print(%-18s%-12s%-12s%-12s%-12s%-12s % (Currency, TSP,CSP, TBP, CBP, Time)for row in rows:print(%-18s%-12.2f%-12.2f%-12

10、.2f%-12.2f%-12s % (row0,row1, row2, row3, row4, row5)def spider(self, url): # 爬虫函数try:resp = urllib.request.urlopen(url) data = resp.read()html = data.decode() soup=BeautifulSoup(html,html.parser) div=soup.find(div,attrs=id:realRateInfo)trs=div.find_all(tr) for tr in trs1:tds=tr.find_all(td) Currenc

11、y = tds0.text.strip() TSP = float(tds3.text)CSP = float(tds4.text) TBP = float(tds5.text) CBP = float(tds6.text) Time = tds7.text.strip()self.insertDB(Currency, TSP, CSP, TBP, CBP, Time) except Exception as err:print(err)def process(self): # 爬取过程self.openDB()self.spider( self.show()self.closeDB()# 主

12、程序spider = MySpider() spider.process()Harry Potter23.99学习 XML39.95Learning Python30.204. 下面是一段 HTML 代码:试用 Beautiful Soup 完成下面的任务。(1) 找出所有书的名称。(2) 找出所有英文书的名称与价格。(3) 找出价格在 30 元以上的所有书的名称。答:from bs4 import BeautifulSouphtml=Harry Potter23.99学习 XML39.95Learning Python30.20 soup=BeautifulSoup(html,html.pa

13、rser) books=soup.find_all(book)for b in books: print(b.find(title).text)print() books=soup.find_all(book) for b in books:title=b.find(title,attrs=lang:english) if title:print(title.text)print()for b in books: price=b.find(price).text if float(price)mVersion: python=ppython url=purl mVersion=sreturn

14、python,urldef searchPython(surl): resp=urllib.request.urlopen(surl) data=resp.read() html=data.decode() soup=BeautifulSoup(html,lxml)div=soup.find(div,attrs=class:row download-list-widget) ol=div.find(name=ol,attrs=class:list-row-container menu) lis=ol.find_all(li)pList=for li in lis: a=li.find(name

15、=span,attrs=class:release-number).find(a)python=a.text url=urllib.request.urljoin(surl,ahref) print(%-20s %s %(python,url) pList.append(python:python,url:url)return pListtry:pList=searchPython(https:/www.python.org/downloads/) python,url=getLatestVersion(pList)print(The latest version) print(python,

16、url)except Exception as e: print(e)6. 在中国天气网中查找一个城市,如深圳,会转到地址为“ weather/101280601.shtml”的网页显示深圳的天气预报,如图 2-8-2 所示。图 2-8-2 深圳的天气预报from bs4 import BeautifulSoup from bs4 import UnicodeDammit import urllib.requesturl= try:headers=User-Agent:Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; en-US; rv:1.9pre)

17、Gecko/2008072421 Minefield/3.0.2prereq=urllib.request.Request(url,headers=headers) data=urllib.request.urlopen(req) data=data.read() dammit=UnicodeDammit(data,utf-8,gbk) data=dammit.unicode_markup soup=BeautifulSoup(data,lxml) lis=soup.select(ulclass=t clearfix li) for li in lis:try:date=li.select(h

18、1)0.text weather=li.select(pclass=wea)0.text编写爬虫程序爬取该网站 7 天内的天气预报,包括日期、天气、温度等数据。答:temp=li.select(pclass=tem span)0.text+/+li.select(pclass=tem i)0.textprint(date,weather,temp) except Exception as err:print(err) except Exception as err:print(err)练习 31. 什么是深度优先法和广度优先法,它们有什么特点? 答:省略2. 如何启动一个 Python 线程?

19、为什么说爬虫程序一般都会使用多线程? 答:省略3. 设计两个网页 A.html 与 B.html,它们都包含相同结构的学生信息(姓名、性别、年龄)。A.html 文件与 B.html 文件如下。姓名: A1性别: 男年龄: 20姓名: A10性别: 女年龄: 18(1)A.html:(2)B.html:姓名: B1性别: 男年龄: 20姓名: B10性别: 女年龄: 18设计一个包含两个线程的爬虫程序,一个线程爬取 A.html,另外一个线程爬取 B.html,爬取的学生信息都保存到列表 students 中,最后显示爬取的结果。答:(1) server.pyimport flaskapp=f

20、lask.Flask(web) app.route(/A)def A():s=姓名: A1性别: 男年龄: 20姓名: A10性别: 女年龄: 18 return sapp.route(/B) def B():s=姓名: B1性别: 男年龄: 20姓名: B10性别: 女年龄: 18 return sapp.debug=True app.run()(2) spider.pyfrom bs4 import BeautifulSoup import urllib.requestimport threadinglock=threading.RLock() def getValue(s):p=s.fi

21、nd(:) return sp+1:def getAB(page): global students try:resp=urllib.request.urlopen(http:/127.0.0.1:5000/+page) html=resp.read().decode() soup=BeautifulSoup(html,html.parser) divs=soup.find_all(div)i=0while ilen(divs): name=getValue(divsi.text) sex=getValue(divsi+1.text) age=getValue(divsi+2.text) i=

22、i+3lock.acquire() students.append(name,sex,age) lock.release()except Exception as err: print(err)students= TA=threading.Thread(target=getAB,args=A) TB=threading.Thread(target=getAB,args=B) TA.start()TB.start() TA.join()TB.join()print(students)结果: B1, 男, 20, B10, 女, 18, A1, 男, 20, A10, 女, 184. 设计一个爬虫

23、程序,爬取一个网站的所有图像。答:from bs4 import BeautifulSoup from bs4 import UnicodeDammit import urllib.requestimport osdef imageSpider(start_url): try:urls= req=urllib.request.Request(start_url,headers=headers) data=urllib.request.urlopen(req)data=data.read() dammit=UnicodeDammit(data,utf-8,gbk) data=dammit.uni

24、code_markup soup=BeautifulSoup(data,lxml) images=soup.select(img)for image in images: try:src=imagesrc url=urllib.request.urljoin(start_url,src) if url not in urls:urls.append(url) print(url) download(url)except Exception as err: print(err)except Exception as err: print(err)def download(url): global

25、 count try:count=count+1 if(urllen(url)-4=.):ext=urllen(url)-4: else:ext= req=urllib.request.Request(url,headers=headers) data=urllib.request.urlopen(req,timeout=100) data=data.read() fobj=open(images+str(count)+ext,wb) fobj.write(data)fobj.close()print(downloaded +str(count)+ext) except Exception a

26、s err:print(err)headers = User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; en-US; rv:1.9pre) Gecko/2008072421 Minefield/3.0.2precount=0if not os.path.exists(images): os.mkdir(images)start_url= imageSpider(start_url)练习 41. 简单说明Scrapy 的入口地址的规定。答:省略2. 比较使用XPath 和 Beautiful Soup 解析 HTML 代码的特点与区别

27、。答:省略3. 在 Scrapy 中如何把爬取的数据写入数据库?items.py 与 pipelines.py 文件有什么作用?答:items.py 定义数据字段,pipelines.py 获取数据进行存储。4. Python 中的 yield 语句如何工作?为什么 Scrapy 爬到的数据使用 yield 语句返回, 而不是使用 return 语句返回?答:省略5. Scrapy 是如何实现爬取多个网页的数据的?如何理解分布式爬取过程? 答:省略import flask app=flask.Flask( name ) app.route(/)def show():page = flask.r

28、equest.args.get(page) if page in flask.request. args else 1maxpage=3 page=int(page) st=学生信息表st=st+fobj=open(students+str(page)+.txt,rt,encoding=utf-8) while True:#读取一行,去除行尾部“n”换行符号s=fobj.readline().strip(n) #如果读到文件尾部就退出if s=:6. 有一个服务器程序,它根据请求页面的不同来展示 3 组学生信息,这些学生信息分别存储在 students1.txt、students2.txt、s

29、tudents3.txt 文件中,每个页面有相同的结构(学号 No、姓名 Name、性别 Gender、年龄 Age),参数 page=N 控制展示 studentsN.txt 的学生表格(N=1,2,3),程序如下:break #按逗号拆分s=s.split(,)st=st+#把各个数据组织在中for i in range(len(s):st=st+si+ #完成一行st=st+fobj.close() st=st+ st=st+if page1:st = st + 【前一页】 if pagemaxpage:st=st+【下一页】 st=st+st=st+ st=st+Page: +str(

30、page)+/+str(maxpage)+return stif name = main : app.run()执行服务器程序,学生信息如图 4-10-1 所示。图 4-10-1 学生信息使用 Scrapy 设计一个爬虫程序,爬取所有学生的信息并将其存储到数据库中。答:1、server.pyimport flask app=flask.Flask( name ) app.route(/)def show():page = flask.request.args.get(page) if page in flask.request.args else 1maxpage=3 page=int(pag

31、e)st=学生信息表st=st+ fobj=open(students+str(page)+.txt,rt,encoding=utf-8) while True:#读取一行,去除行尾部“n”换行符号s=fobj.readline().strip(n) #如果读到文件尾部就退出if s=:break #按逗号拆分s=s.split(,) st=st+#把各个数据组织在中for i in range(len(s):st=st+si+ #完成一行st=st+ fobj.close() st=st+ st=st+if page1:st = st + 【前一页】 if pagemaxpage:st=st

32、+【下一页】 st=st+st=st+ st=st+Page: +str(page)+/+str(maxpage)+return stif name = main : app.debug=True app.run()2、爬虫程序scrapy startproject demo(1) items.pyimport scrapyclass StudentItem(scrapy.Item):# define the fields for your item here like: No = scrapy.Field()Name=scrapy.Field() Gender=scrapy.Field()

33、Age=scrapy.Field()(2) pipelines.pyimport sqlite3class DemoPipeline:def open_spider(self,spider): print(opened)try:self.con=sqlite3.connect(students.db) self.cursor=self.con.cursor()try:self.cursor.execute(drop table students) except:pass try:sql=create table students(No varchar(8) primary key, Name

34、varchar(32),Gender varchar(8), Age int)self.cursor.execute(sql) except:self.cursor.execute(delete from students) self.opened=Trueself.count=0except Exception as err: print(err) self.opened=Falsedef close_spider(self, spider): if self.opened:mit()self.con.close() self.opened=Falseprint(closed)print(总共爬取,self.count,条记录)def process_item(self, item, spider): if self.opened:

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 技术方案

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁