第三次作业-MOOC学习笔记:Python网络爬虫与信息提取

1.注册中国大学MOOC

第三次作业-MOOC学习笔记:Python网络爬虫与信息提取

2.选择北京理工大学嵩天老师的《Python网络爬虫与信息提取》MOOC课程

第三次作业-MOOC学习笔记:Python网络爬虫与信息提取

3.学习完成第0周至第4周的课程内容,并完成各周作业

第三次作业-MOOC学习笔记:Python网络爬虫与信息提取

第一周

Requests库的爬取性能分析

import requests
import time
def getHTMLText(url):
try:
r = requests.get(url,timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return "产生异常" start = time.perf_counter()
for i in range(100):
getHTMLText("https://www.baidu.com")
end = time.perf_counter()
print("抓取100次百度首页内容所用时间:{:.2f}秒".format(end-start))

  

第二周

中国大学排名定向爬虫

import requests
from bs4 import BeautifulSoup
import bs4 def getHTMLText(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return "" def fillUnivList(ulist, html):
soup = BeautifulSoup(html, "html.parser")
for tr in soup.find('tbody').children:
if isinstance(tr, bs4.element.Tag):
tds = tr('td')
ulist.append([tds[0].string, tds[1].string, tds[3].string]) def printUnivList(ulist, num):
tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"
print(tplt.format("排名","学校名称","总分",chr(12288)))
for i in range(num):
u=ulist[i]
print(tplt.format(u[0],u[1],u[2],chr(12288))) def main():
uinfo = []
url = 'https://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html'
html = getHTMLText(url)
fillUnivList(uinfo, html)
printUnivList(uinfo, 20) # 20 univs
main()

  

第三周

淘宝商品比价定向爬虫

import requests
import re def getHTMLText(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return "" def parsePage(ilt, html):
try:
plt = re.findall(r'\"view_price\"\:\"[\d\.]*\"',html)
tlt = re.findall(r'\"raw_title\"\:\".*?\"',html)
for i in range(len(plt)):
price = eval(plt[i].split(':')[1])
title = eval(tlt[i].split(':')[1])
ilt.append([price , title])
except:
print("") def printGoodsList(ilt):
tplt = "{:4}\t{:8}\t{:16}"
print(tplt.format("序号", "价格", "商品名称"))
count = 0
for g in ilt:
count = count + 1
print(tplt.format(count, g[0], g[1])) def main():
goods = '书包'
depth = 3
start_url = 'https://s.taobao.com/search?q=' + goods
infoList = []
for i in range(depth):
try:
url = start_url + '&s=' + str(44*i)
html = getHTMLText(url)
parsePage(infoList, html)
except:
continue
printGoodsList(infoList) main()

  

股票数据定向爬虫

import requests
from bs4 import BeautifulSoup
import traceback
import re def getHTMLText(url, code="utf-8"):
try:
r = requests.get(url)
r.raise_for_status()
r.encoding = code
return r.text
except:
return "" def getStockList(lst, stockURL):
html = getHTMLText(stockURL, "GB2312")
soup = BeautifulSoup(html, 'html.parser')
a = soup.find_all('a')
for i in a:
try:
href = i.attrs['href']
lst.append(re.findall(r"[s][hz]\d{6}", href)[0])
except:
continue def getStockInfo(lst, stockURL, fpath):
count = 0
for stock in lst:
url = stockURL + stock + ".html"
html = getHTMLText(url)
try:
if html=="":
continue
infoDict = {}
soup = BeautifulSoup(html, 'html.parser')
stockInfo = soup.find('div',attrs={'class':'stock-bets'}) name = stockInfo.find_all(attrs={'class':'bets-name'})[0]
infoDict.update({'股票名称': name.text.split()[0]}) keyList = stockInfo.find_all('dt')
valueList = stockInfo.find_all('dd')
for i in range(len(keyList)):
key = keyList[i].text
val = valueList[i].text
infoDict[key] = val with open(fpath, 'a', encoding='utf-8') as f:
f.write( str(infoDict) + '\n' )
count = count + 1
print("\r当前进度: {:.2f}%".format(count*100/len(lst)),end="")
except:
count = count + 1
print("\r当前进度: {:.2f}%".format(count*100/len(lst)),end="")
continue def main():
stock_list_url = 'https://quote.eastmoney.com/stocklist.html'
stock_info_url = 'https://gupiao.baidu.com/stock/'
output_file = 'D:/BaiduStockInfo.txt'
slist=[]
getStockList(slist, stock_list_url)
getStockInfo(slist, stock_info_url, output_file) main()

  

第四周

股票数据Scrapy爬虫

import scrapy
import re class StocksSpider(scrapy.Spider):
name = "stocks"
start_urls = ['https://quote.eastmoney.com/stocklist.html'] def parse(self, response):
for href in response.css('a::attr(href)').extract():
try:
stock = re.findall(r"[s][hz]\d{6}", href)[0]
url = 'https://gupiao.baidu.com/stock/' + stock + '.html'
yield scrapy.Request(url, callback=self.parse_stock)
except:
continue def parse_stock(self, response):
infoDict = {}
stockInfo = response.css('.stock-bets')
name = stockInfo.css('.bets-name').extract()[0]
keyList = stockInfo.css('dt').extract()
valueList = stockInfo.css('dd').extract()
for i in range(len(keyList)):
key = re.findall(r'>.*</dt>', keyList[i])[0][1:-5]
try:
val = re.findall(r'\d+\.?.*</dd>', valueList[i])[0][0:-5]
except:
val = '--'
infoDict[key]=val infoDict.update(
{'股票名称': re.findall('\s.*\(',name)[0].split()[0] + \
re.findall('\>.*\<', name)[0][1:-1]})
yield infoDict

  

4.提供图片或网站显示的学习进度,证明学习的过程。

第三次作业-MOOC学习笔记:Python网络爬虫与信息提取第三次作业-MOOC学习笔记:Python网络爬虫与信息提取

5.写一篇不少于1000字的学习笔记,谈一下学习的体会和收获。

经过这段时间的学习,我对爬虫有了一定的了解,爬虫就是一个程序,这个程序的目的就是为了抓取万维网信息资源,比如你日常百度、谷歌等搜索引擎,搜索结果就全都依赖来定时获取。通过学习我知道了Python 爬虫架构主要由五个部分组成,分别是调度器、URL管理器、网页下载器、网页解析器、应用程序。学习网络爬虫主要分成抓取,分析,存储三大板块。抓取即当我们在浏览器中输入一个url后回车,会发生以下步骤:一为查找域名对应的IP地址。二为向IP对应的服务器发送请求。三为服务器响应请求,发回网页内容。四是浏览器解析网页内容。网络爬虫要做的,简单来说,就是实现浏览器的功能。通过指定url,直接返回给用户所需要的数据,而不需要一步步人工去操纵浏览器获取。分析就是抓取之后就是对抓取的内容进行分析,你需要什么内容,就从中提炼出相关的内容来。常见的分析工具有正则表达式,BeautifulSoup,lxml等等。分析出我们需要的内容之后,接下来就是存储了。我们可以选择存入文本文件,也可以选择存入。这次课程我还学习了Python第三方库Requests,讲解通过HTTP/HTTPS协议自动从互联网获取数据并向其提交请求的方法;Python第三方库Beautiful Soup,讲解从所爬取HTML页面中解析完整Web信息的方法;Python标准库Re,讲解从所爬取HTML页面中提取关键信息的方法;Python第三方库Scrapy,介绍通过网络爬虫框架构造专业网络爬虫的基本方法。Requests库与HTTP协议的方法,功能是一一对应的,包括以下7个方法:requests.request() 构造一个请求,支撑以下各方法的基础方法 requests.get() 获取HTML网页的主要方法,对应HTTP协议的GET requests.head() 获取HTML网页头信息的方法,对应HTTP协议的HEAD requests.post() 向HTML网页提交POST请求的方法,对应HTTP协议的POST requests.put() 向HTML网页提交PUT请求的方法,对应HTTP协议的PUT requests.patch 向HTML网页提交局部修改,对应HTTP协议的PATCH requests.delete() 向HTML网页提交删除请求的方法,对应HTTP协议的DELETE。在这7种方式中,我们除了直接使用request()方法之外,还可以使用requests库的对应方法。比如说,requests.get()、requests.head()、requests.post()来实现。Urequest()还有13个访问控制的参数分别是params,data,json,headers,cookies 和 auth,files,timeout,proxies,allow_redirects 和 stream,verify 和 cert。crapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。我们需要知道的是,scrapy是一种集成框架,类似于request和xpath这些方法在scrapy都有集成。scrapy中,不同模块负责不同的任务分工。首先Scheduler发出请求(Requests),Downloader负责从互联网上下载内容,将下载好的内容(Responses)交给Spiders进行解析,解析完成后将内容Item返回,当然其中可能会涉及到对于解析后数据的进一步处理,这个任务是在Pipeline中完成的。它通常有两种使用方式,分别为直接在python脚本里定义一个爬取数据的类和创建完整的scrapy项目。这次学习使我受益匪浅,使我对python网络爬虫有了一定的了解。

上一篇:对于JavaScript的函数.NET开发人员应该知道的11件事


下一篇:初识python第一天