5分钟学会Python爬取整个网站
Editor's Note
周末花5分钟学个爬虫可还行
The following article is from 蚂蚁学Python Author 蚂蚁
本图文配套视频演示
爬取网站的步骤:
设定爬取目标
目标网站:我自己的博客,疯狂的蚂蚁 http://www.crazyant.net
目标数据:所有博客文章的 - 链接、标题、标签
2. 分析目标网站
爬取页面
http://www.crazyant.net/page/1 ~ http://www.crazyant.net/page/24
待爬取数据:HTML元素中的h2 class=entry-title下的超链接的标题和链接,标签列表
3. 批量下载HTML
使用requests库实现下载
官网:https://2.python-requests.org//zh_CN/latest/user/quickstart.html
4. 实现HTML解析,得到目标数据
使用BeautifulSoup库解析
官网:https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/
5. 将结果数据存储
可以使用json.dumps把这个数据序列化存储
也可以将数据存入MySQL
import requestsfrom bs4 import BeautifulSoupimport pprintimport json
1、下载所有的页面的HTML
def download_all_htmls():"""下载所有列表页面的HTML,用于后续的分析"""htmls = []for idx in range(24):url = f"http://www.crazyant.net/page/{idx+1}"print("craw html:", url)r = requests.get(url)if r.status_code != 200:raise Exception("error")htmls.append(r.text)return htmls
# 执行爬取htmls = download_all_htmls()
craw html: http://www.crazyant.net/page/1craw html: http://www.crazyant.net/page/2craw html: http://www.crazyant.net/page/3craw html: http://www.crazyant.net/page/4craw html: http://www.crazyant.net/page/5craw html: http://www.crazyant.net/page/6-- 省略很多行craw html: http://www.crazyant.net/page/21craw html: http://www.crazyant.net/page/22craw html: http://www.crazyant.net/page/23craw html: http://www.crazyant.net/page/24
htmls[0]
'<!DOCTYPE html><html lang="zh-CN" class="no-js"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width"><link rel="profile" href="http://gmpg.org/xfn/11"><link rel="pingback" href="http://www.crazyant.net/xmlrpc.php"> <!--[if lt IE 9]> <script src="http://www.crazyant.net/wp-content/themes/twentyfifteen/js/html5.js"></script> <![endif]--> <script>(function(html){html.className = html.className.replace(/\\bno-js\\b/,\'js\')})(document.documentElement);</script> <title>疯狂的蚂蚁 – 视频公众号:蚂蚁学Python</title><link rel=\'dns-prefetch\' href=\'//cdn.bibblio.org\' /><link rel="alternate" type="application/rss+xml" title="疯狂的蚂蚁 » Feed" href="http://www.crazyant.net/feed" /><link rel="alternate" type="application/rss+xml" title="疯狂的蚂蚁 » 评论Feed" href="http://www.crazyant.net/comments/feed" /> <!-- mana
2、解析HTML得到数据
def parse_single_html(html):"""解析单个HTML,得到数据@return list({"link", "title", [label]})"""soup = BeautifulSoup(html, 'html.parser')articles = soup.find_all("article")datas = []for article in articles:# 查找超链接title_node = (article.find("h2", class_="entry-title").find("a"))title = title_node.get_text()link = title_node["href"]# 查找标签列表tag_nodes = (article.find("footer", class_="entry-footer").find("span", class_="tags-links").find_all("a"))tags = [tag_node.get_text() for tag_node in tag_nodes]datas.append({"title":title, "link":link, "tags":tags})return datas
pprint.pprint(parse_single_html(htmls[0]))
[{'link': 'http://www.crazyant.net/2469.html','tags': ['java', 'spark'],'title': 'Spark使用Java开发遇到的那些类型错误'},{'link': 'http://www.crazyant.net/2454.html','tags': ['pandas', 'python', 'sklearn', '推荐系统'],'title': '推荐系统:实现文章相似推荐的简单实例'},{'link': 'http://www.crazyant.net/2447.html','tags': ['item2vec', 'java', '推荐系统'],'title': 'Spark使用word2vec训练item2vec实现内容相关推荐'},-- 省略很多行
# 执行所有的HTML页面的解析all_datas = []for html in htmls:all_datas.extend(parse_single_html(html))
all_datas
[{'title': 'Spark使用Java开发遇到的那些类型错误','link': 'http://www.crazyant.net/2469.html','tags': ['java', 'spark']},{'title': '推荐系统:实现文章相似推荐的简单实例','link': 'http://www.crazyant.net/2454.html','tags': ['pandas', 'python', 'sklearn', '推荐系统']},-- 省略很多行
len(all_datas)
239
3、将结果输出存储
with open("all_article_links.json", "w") as fout:for data in all_datas:fout.write(json.dumps(data, ensure_ascii=False)+"\n")
输出结果文件:
本文的代码在:
https://github.com/peiss/ant-learn-python/tree/master/2019-09-05%205%E5%88%86%E9%92%9F%E5%AD%A6%E4%BC%9APython%E7%88%AC%E5%8F%96%E6%95%B4%E4%B8%AA%E7%BD%91%E7%AB%99
猜你喜欢
数据分析必知必会,缺失值处理技巧大全!(文末送书)
给大家精心18本Python高清电子书,对比学习效率更高哦 !
据说假设检验是个很难的题