下面是“Python正则爬取某段子网站前20页段子(Request库)过程解析”的详细攻略。
1. 前置知识
在学习本篇攻略之前,你需要掌握一些基本的Python知识和爬虫相关知识:
- Python基础:掌握Python的常用数据类型、流程控制语句、函数等基本知识;
- requests库:掌握requests库的基本用法,包括发起请求、设置请求头、获取响应内容等;
- 正则表达式:掌握正则表达式的基本语法和常用的正则表达式操作符。
2. 实现过程
本文将使用Python的requests库和正则表达式,爬取糗事百科网站的段子,并将结果输出到控制台。
2.1 获取页面内容
import requests
# 请求头信息
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/58.0.3029.110 Safari/537.3'}
# 请求糗事百科的第一页数据
url = 'https://www.qiushibaike.com/text/'
r = requests.get(url, headers=headers)
# 如果请求成功,打印响应内容
if r.status_code == 200:
print(r.content.decode('utf-8'))
上面的代码使用requests库发起了一个GET请求,请求糗事百科网站的文本段子页面,并通过设置请求头模拟了浏览器访问。如果请求成功,就打印出响应内容。
2.2 使用正则表达式提取段子
import re
# 匹配整条段子的正则表达式
pattern = re.compile('<div class="content">\n<span>(.*?)</span>.*?<div class="stats">\n.*?<i class="number">(\d+)</i>', re.S)
# 匹配所有段子
items = re.findall(pattern, r.content.decode('utf-8'))
# 输出前20条段子的内容和评论数
for index, item in enumerate(items[:20]):
print('第{}条段子:{}'.format(index + 1, item[0].strip()))
print('评论数:{}'.format(item[1]))
print('=' * 50)
上面的代码使用正则表达式匹配整条段子的正则表达式,并使用re.findall方法匹配所有的段子信息。接着,使用for循环输出前20条段子的内容和评论数。
2.3 爬取多页段子
for page in range(1, 21):
url = 'https://www.qiushibaike.com/text/page/{}'.format(page)
r = requests.get(url, headers=headers)
if r.status_code == 200:
items = re.findall(pattern, r.content.decode('utf-8'))
for index, item in enumerate(items):
print('第{}条段子:{}'.format((page - 1) * 20 + index + 1, item[0].strip()))
print('评论数:{}'.format(item[1]))
print('=' * 50)
上面的代码使用for循环爬取前20页的段子信息,并在每一页中按照前面的方法提取段子信息并输出。注意,在url中使用format方法将要请求的页码填充进去,这样就可以爬取多页段子了。
3. 示例说明
3.1 示例1-基本爬取
下面的代码示例是用于从网站中爬取文本信息,它的网址是这样的:
"https://www.quotes.toscrape.com/page/{}/"
代码如下:
import requests
from bs4 import BeautifulSoup
for i in range(10):
url = "https://www.quotes.toscrape.com/page/{}/".format(i)
res = requests.get(url)
soup = BeautifulSoup(res.text, "html.parser")
content = soup.find_all("span", class_="text")
for j in range(len(content)):
print("{0}:{1}".format(j+1, content[j].text))
上面的代码使用了requests库和BeautifulSoup库去爬取页面信息,并使用循环,分页爬取多个页面。第一个循环用于控制访问的页面数量,第二个循环用于对页面中的信息进行整理和存储。最后输出结果。
3.2 示例2-高级爬取
下面的代码示例是用于从Bing搜索引擎中爬取相关信息,它的网址是这样的:
"https://cn.bing.com/search?q={}&qs=n&form=QBLH&pq={}"
代码如下:
import requests
from bs4 import BeautifulSoup
def get_data(keyword):
results = []
url = 'https://cn.bing.com/search?q={}&qs=n&form=QBLH&pq={}'.format(keyword, keyword)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
html = requests.get(url, headers=headers).text
soup = BeautifulSoup(html, 'html.parser')
tags = soup.find_all('li', class_='b_algo')
for tag in tags:
title = tag.find('a').text
link = tag.find('a').get('href', None)
meta = tag.find('div', class_='b_caption').find('p').text
result = {'title': title, 'link': link, 'meta': meta}
results.append(result)
return results
if __name__ == '__main__':
keyword = 'Python'
data = get_data(keyword)
for index, result in enumerate(data):
print('{0}. {1}'.format(index + 1, result['title']))
print('链接:{0}'.format(result['link']))
print('描述:{0}'.format(result['meta']))
print('=' * 60)
上面的代码使用了requests库和BeautifulSoup库爬取了Bing搜索引擎的页面,并抽取了搜索结果的标题、链接和描述信息。其中使用了函数封装进行了代码抽取,减少了重复代码的出现,提高了代码的复用性和可读性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python正则爬取某段子网站前20页段子(request库)过程解析 - Python技术站