先说需求:
1、在django项目中需要更新新股的上市时间,但又不想手动去更新;
2、所以准备用爬虫技术去自动获取上市时间,然后自动更新数据库;
3、所幸找到了 天天基金网 有想要信息,例如新股 中铝国际 的详情页
http://data.eastmoney.com/xg/xg/detail/601068.html。
1、工具安装
- requests:python中处理http请求的利器。
- beautifulsoup4:解析html文档的利器,官方中文文档https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/。
# 用pip方式安装 requests 与 beautifulsoup4
pip install requests
pip install beautifulsoup4
2、使用 requests 发送请求
# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
base_url = "http://data.eastmoney.com/xg/xg/detail/601068.html"
# 设置请求头,模拟浏览器行为
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
}
# 发送请求并获取返回数据
response = requests.get(base_url, headers=headers)
# 获取html网页源码
print response.text
浏览器请求头信息可以使用谷歌浏览器的开发者工具查看:
3、使用 beautifulsoup 解析html文档
# 首先新建个BeautifulSoup对象,指定html解析器为python标准库自带的html.parser
soup = BeautifulSoup(response.text, 'html.parser')
# 根据网页源码结构,获取到“申购状况”这个 table (第二个table)
sg_table_tag = soup.find_all("table")[1]
# 获取对应的 tr (第一个tr)
ss_tr_tag = sg_table_tag.tr
# 获取对应的 td (第五个td)
ss_td_tag = ss_tr_tag.find_all("td")[4]
# 获取对应 td 的内容,并去除所有空格得到:2018-08-31 (周五)
ss_td_text = ss_td_tag.string.replace(" ", "")
# 截取上市时间:2018-08-31
print ss_td_text[:11]
4、编码问题
期间可能会遇到编码问题:
‘ascii’ codec can’t encode character u’\xa0’ in position 0: ordinal not in range(128)
我是这样解决的,希望对碰到的人有点帮助:
# 截取上市时间:2018-08-31,但如果直接转换成时间格式会报编码错误
ss_date = ss_td_text[:11]
# 用下面这行代码解决的
ss_date = ss_date.encode("utf-8").decode('ascii', 'ignore')
# 顺利转换成日期格式
ss_date = datetime.datetime.strptime(ss_date, "%Y-%m-%d").date()
5、结束语
完美结束,再结合django定时任务自动更新数据库即可。
只想说,python插件真是太强大啦。。。