假如我们想爬取糗事百科(http://www.qiushibaike.com/)上的段子,今天的Demo如下:
import re
import urllib.request
#爬取页面链接
def get_content(url,page):
# 模拟成浏览器
headers = ("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.4882.400 QQBrowser/9.7.13059.400")
opener = urllib.request.build_opener()
opener.addheaders = [headers]
# 将opener安装为全局
urllib.request.install_opener(opener)
html_info = urllib.request.urlopen(url).read().decode("utf-8")
#构建对应用户提取的正则表达式,要根据网站实际情况改变
user_pat = 'target="_blank" rel="nofollow" style=.+?<img src=".+? alt="(.*?)">'
# 构建段子内容提取的正则表达式
content_pat = '<div class="content">(.*?)</div>'
# 寻找出所有的用户
user_list = re.compile(user_pat, re.S).findall(html_info)
# 寻找出所有的内容
cotent_list = re.compile(content_pat, re.S).findall(html_info)
# 通过for循环遍历段子内容并将内容分别赋给对应的变量
x = 1
for content in cotent_list:
content = content.replace("\n", "")
# 用字符串作为变量名,先将对应字符串赋给一个变量
name = "content" + str(x)
# 通过exec()函数实现用字符串作为变量名并赋值
exec(name+'=content')
x += 1
y = 1
# 通过for循环遍历用户,并输出该用户对应的内容
for user in user_list:
name = "content" + str(y)
print("用户" + str(page) + str(y) + "是:" + user)
print("内容是:")
exec("print("+name+")")
print("\n")
y += 1
#分别获取各页的段子,通过for循环可以获取多页
for i in range(1, 10):
# https://www.qiushibaike.com/8hr/page/5/
url = "https://www.qiushibaike.com/8hr/page/" + str(i)
get_content(url, i)
爬虫的原理基本都是相同的,主要不同体现在数据的过滤,也就是正则表达式的不同,所以我们需要观察网页代码的特性,取出所需的内容,然后再进行筛选,组合。