关键词

python正则爬取某段子网站前20页段子(request库)过程解析

下面是“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搜索引擎的页面,并抽取了搜索结果的标题、链接和描述信息。其中使用了函数封装进行了代码抽取,减少了重复代码的出现,提高了代码的复用性和可读性。

本文链接:http://task.lmcjl.com/news/6700.html

展开阅读全文