你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

python如何爬取糗事百科

2021/12/26 3:10:58

 所需要引入的库,python版本号不同,加入#coding=gbk,避免正文中出现中文时报错。

爬取的内容,跟路径在开发者模式中选择 

 包裹的内容。 现在我们想获取发布人,发布日期,段子内容,以及点赞的个数。不过另外注意的是,段子有些是带图片的,如果我们想在控制台显示图片是不现实的,所以我们直接把带有图片的段子给它剔除掉,只保存仅含文本的段子。 所以我们加入如下正则表达式来匹配一下,用到的方法是 re.findall 是找寻所有匹配的内容。方法的用法详情可以看前面说的正则表达式的介绍。 好,我们的正则表达式匹配语句书写如下,在原来的基础上追加如下代码

 现在正则表达式在这里稍作说明 1).? 是一个固定的搭配,. 和代表可以匹配任意无限多个字符,加上?表示使用非贪婪模式进行匹配,也就是我们会尽可能短地做匹配,以后我们还会大量用到 .? 的搭配。 2)(.?) 代表一个分组,在这个正则表达式中我们匹配了五个分组,在后面的遍历 item 中,item [0] 就代表第一个 (.?) 所指代的内容,item [1] 就代表第二个 (.?) 所指代的内容,以此类推。 3)re.S 标志代表在匹配时为点任意匹配模式,点。也可以代表换行符。 这样我们就获取了发布人,发布时间,发布内容,附加图片以及点赞数。 在这里注意一下,我们要获取的内容如果是带有图片,直接输出出来比较繁琐,所以这里我们只获取不带图片的段子就好了。 所以,在这里我们就需要对带图片的段子进行过滤。 我们可以发现,带有图片的段子会带有类似下面的代码,而不带图片的则没有,所以,我们的正则表达式的 item [3] 就是获取了下面的内容,如果不带图片,item [3] 获取的内容便是空。

最后完整的代码是:

 

# coding=gbk

import requests
from lxml import etree
import json
import xlwt
import os


def get_Page(url):
    # 构建请求头
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'}
    response = requests.get(url, headers=headers, timeout=10)
    if response.status_code == 200:
        # 从网站分析出响应内容的编码
        # print(response.encoding)
        response.encoding = 'UTF-8'
        # print(response.text)
        return response.text
    else:
        print("请求网页失败")
def parse_Page(html):
    html_lxml = etree.HTML(html)
    # 获取到每一块的所有内容
    datas = html_lxml.xpath('//li[contains(@id,"qiushi_tag")]')
    item = {}
    for data in datas:
        # print(data.attrib)
        # 用户名称
        作者名 = data.xpath('.//a[@class="recmd-user"]/span/text()')
        # 糗事内容
        糗事内容 = data.xpath('.//a')[1].text.strip()
        # # 评论数
        评论数量 = data.xpath('.//div[@class="recmd-num"]/span[4]/text()')
        # # 好笑数
        点赞数 = data.xpath('.//div[@class="recmd-num"]/span[1]/text()')
        # # 图片
        图片 = data.xpath('.//a[1]/img/@src')
        item = {
            '作者名': 作者名,
            '糗事内容': 糗事内容,
             '评论数量': 评论数量,
             '点赞数': 点赞数,
             '图片': 图片[0]
        }
        print(item['作者名'])
        js = json.dumps(item)
        file = open('test.txt', 'a',encoding='utf-8')
        file.write(str(item)+'\n')
        file.close()
        print(item['糗事内容'])
        js = json.dumps(item)
        file = open('test.txt', 'a', encoding='utf-8')
        file.write(str(item) + '\n')
        file.close()
        print(item['评论数量'])
        js = json.dumps(item)
        file = open('test.txt', 'a', encoding='utf-8')
        file.write(str(item) + '\n')
        file.close()
        print(item['点赞数'])
        js = json.dumps(item)
        file = open('test.txt', 'a', encoding='utf-8')
        file.write(str(item) + '\n')
        file.close()
        print(item['图片'])
        js = json.dumps(item)
        file = open('test.txt', 'a', encoding='utf-8')
        file.write(str(item) + '\n')
        file.close()



def main(num):
    for index in range(num):
        url = 'https://www.qiushibaike.com/8hr/page/' + str(index)
        html = get_Page(url)
        parse_Page(html)


if __name__ == '__main__':
    main(3)


def txt_xls(filename, xlsname):
    try:
        f = open(filename, 'r', encoding='utf-8')
        xls = xlwt.Workbook()
        sheet = xls.add_sheet('sheet1', cell_overwrite_ok=True)
        x = 0
        while True:
            # 按行循环,读取文本文件
            line = f.readline()
            if not line:
                break
            for i in range(len(line.split('\t'))):
                item = line.split('\t')[i]
                sheet.write(x, i, item)
            x += 1
        f.close()
        xls.save(xlsname)  # 保存xls文件
    except:
        raise
if __name__ == "__main__":
    filename = "C:\\Users\\xiaofeng\\PycharmProjects\\pythonProject1\\test.txt"  # 需要转化的文件
    xlsname = "C:\\Users\\xiaofeng\\PycharmProjects\\pythonProject1\\test.xls"  # 保存及命名
    txt_xls(filename, xlsname)
    os.startfile('test.xls')

其中跟路径需要变化,否则会报错,最后会生成两个文件

并自动打开xls文件,其中txt文件为

xls文件为

 这就是我们python爬取糗事百科的全部内容