文章实践主要来自于:https://mp.weixin.qq.com/s/FiKqb06nz0K0AD9VUWJapw

爬虫流程:

明确目的(哪些数据),确认网页可爬,查看源网页是否有需要的数据。

bs4简介

Beautiful Soup是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式。

python

with方法--

with语句执行的解析:

  with context_expr() as var:

    doSomething()

  1. 当with语句执行时,便执行上下文表达式(context_expr)(一般为某个方法)来获得一个上下文管理器对象,上下文管理器的职责是提供一个上下文对象,用于在with语句块中处理细节:
  2. 一旦获得了上下文对象,就会调用它的__enter__()方法,将完成with语句块执行前的所有准备工作,如果with语句后面跟了as语句,则用__enter__()方法的返回值来赋值;
  3. 当with语句块结束时,无论是正常结束,还是由于异常,都会调用上下文对象的__exit__()方法,__exit__()方法有3个参数,如果with语句正常结束,三个参数全部都是 None;如果发生异常,三个参数的值分别等于调用sys.exc_info()函数返回的三个值:类型(异常类)、值(异常实例)和跟踪记录(traceback),相应的跟踪记录对象。
  4. 因为上下文管理器主要作用于共享资源,__enter__()和__exit__()方法基本是完成的是分配和释放资源的低层次工作,比如:数据库连接、锁分配、信号量加/减、状态管理、文件打开/关闭、异常处理等。

  3、自定义类使用with来管理

完整代码示例:

 # -*- coding: utf-8 -*-

 # Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种: Tag , NavigableString , BeautifulSoup , Comment .

 import requests
from bs4 import BeautifulSoup
import traceback
import re def getHTMLText(url):
try:
r = requests.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return "" def getStockList(lst, stockURL):
html = getHTMLText(stockURL)
# 返回的是BeautifulSoup对象
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_doc = getHTMLText(url)
try:
if html_doc == "":
continue
infoDict = {} soup = BeautifulSoup(html_doc, 'html.parser')
# 寻找所有属性为stock-bets的div标签,构成一个list
stockInfo = soup.find('div', attrs={'class': 'stock-bets'})
# 找到所有class==bets-name的标签 # 使用find方法返回的同样是bs4对象,find返回的是由bs4对象构成的list
name = stockInfo.find(attrs={'class': 'bets-name'})
# .text方法以list对象的方式返回tag的内容
infoDict.update({'股票名称': name.text.split[0]})
# 每个股票中每个key正好对应一个值,这里恰好不用数据处理
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
# 内置open()函数,打开一个文件用于追加。
# 如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
# 使用with语句时,如文件打开发生异常,可记录跟踪调查
with open(fpath, 'a', encoding='utf-8') as f:
f.write(str(infoDict) + '\n')
count = count + 1
# 通过\r使得每次打印的时候光标换行到上一行开头,使得看起来进度条是连续的
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 = 'http://quote.eastmoney.com/stocklist.html'
stock_info_url = 'https://gupiao.baidu.com/stock/'
output_file = '/home/icarus/code/pachong_stock/BaiduStockInfo.txt'
slist = []
getStockList(slist, stock_list_url)
getStockInfo(slist, stock_info_url, output_file)
main()

最新文章

  1. MSCRM CRM 获取PickList 字段值函数解决方案
  2. sql之left join、right join、inner join的区别
  3. PHP禁止同一IP频繁访问以防止网站被防攻击或采集的代码
  4. Setting up SSL for SCM-Manager with Microsoft CA and TortoiseHg
  5. WPF绑定数据源
  6. linux驱动系列之s3c2440内存布局
  7. java实现多继承
  8. Tomacat服务器的安装和配置
  9. Strut2 和Spring MVC 文件上传对比
  10. 查看linux服务器版本
  11. apply 与arguments的用法
  12. sql2008中时间类型问题
  13. html5权威指南:表单元素
  14. 大数据Python学习大纲
  15. java 关于性别的处理
  16. 数字不断递增 可控制js
  17. LeetCode之“树”:Symmetric Tree && Same Tree
  18. 亿级流量场景下,大型缓存架构设计实现【1】---redis篇
  19. int main(int argc,char *argv[])与int main(int argc,char **argv)区别?
  20. C# 中使用Linq和Lambda表达式对List<T>进行排序

热门文章

  1. Aactivity和Service之间的通信
  2. springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑。为了区别不同的异常通常根据异常类型自定义异常类,这里我们创建一个自定义系统异常,如果controller、service、dao抛出此类异常说明是系统预期处理的异常信息。
  3. 相机拍摄时最重要的三个参数——光圈、快门、ISO
  4. beego启动找不到conf的原因
  5. StartServiceCtrlDispatcher
  6. axios 设置拦截器 全局设置带默认参数(发送 token 等)
  7. 马婕 2014年MBA,mpacc备考 报刊宣读1 中国的电子商务(转)
  8. 用python实现各种排序算法
  9. mac windows蓝牙问题
  10. 【翻译】JavaScript循环和作用域