Mac——利用Python进行网页爬取

目标:利用Python爬取网页中的指定内容,例如,爬取百度百科网页中四川省的别名。

输出:四川省的别名为:川、蜀、天府之国

个人经验,网页爬取主要掌握2个核心点:

网页爬虫的原理(Python爬虫入门教程:超级简单的Python爬虫教程)

正则表达式的灵活应用(Python3 正则表达式,正则表达式-菜鸟教程)

说得直白一点,就是从一大堆文本中(网页=html代码)快速找到个人感兴趣的信息(爬取结果)!接下来,本文分为3步来进行实现。

1、打开待爬取的网页

百度输入四川省,点击进入,复制链接:https://baike.baidu.com/item/四川/212569?fromtitle=四川省&fromid=15626925,这个链接看着不爽,可以试试打开链接https://baike.baidu.com/item/四川省(爬取的时候用这个链接,批处理方便些)也是可以的!打开后的界面如下:

2、在当前页面,点击鼠标右键,查看网页源代码

这里打开网页看源代码的主要目的:利用正则表达式,对爬取后的网页内容进行关键词提取。

3、Python代码编写(爬取网页内容 + 正则提取感兴趣的信息)

import requests
import re
from urllib import parse
# step 1: 获取网页内容
def getHtml(url):
try:
req_headers = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
}
r = requests.get(url, headers=req_headers)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except EOFError:
print("fail")
# step 2: 利用正则表达式从网页中提取关键词
# 例如: 爬取省份的别名
def craw_baidubaike(province_name):
ori_url = "https://baike.baidu.com/item/xxx"
with open("craw_results.txt", "w", encoding="utf-8") as file:
# -- windows系统需要进行编码转换
# province_parse = parse.urlencode({"wd": province_name})[3:]
# url = ori_url.replace("xxx", province_parse)
url = ori_url.replace("xxx", province_name)
html = getHtml(url)
pattern_page_format = re.compile('名\n\n(.*?)\n',
flags=re.DOTALL)
province_abbreviate = re.findall(pattern_page_format, html)[0]
print("{0}的别名为: {1}".format(province_name, province_abbreviate))
if __name__ == "__main__":
craw_baidubaike(province_name="四川省")

输出:

四川省的别名为: 川、蜀、天府之国

其中,代码中的4个地点需要注意:

req_headers的设置

网页内容的编码处理

网页url在windows上可能不支持中文拼接

正则表达式的编写:'名\n\n(.*?)\n'

这里主要用到了(.*?),它表示匹配任意字符到下一个符合条件的字符。再回顾下待提取的这段html代码(换行符:"\n"),

别 名

川、蜀、天府之国

细细地再品下,问题不大!知道了这个原理,相信能够快速地爬取其他网页中感兴趣信息。

例如:爬取 四川大学的简称,将craw_baidubaike()中的代码改成下面的内容。

pattern_page_format = re.compile('称\n\n(.*?)\n',
flags=re.DOTALL)
university_abbreviate = re.findall(pattern_page_format, html)[0]
print("{0}的简称为: {1}".format(university_name, university_abbreviate))

输出:

四川大学的简称为: 川大、SCU