使用Python对CSDN问答区内容进行爬取

项目介绍

今天无聊没事写了一个python的爬虫项目,用于对CSDN问答区的内容进行爬取并在终端呈现出来。
在这里插入图片描述
此次爬取的内容主要包括问题主页主页标题以及子页的链接
在这里插入图片描述
以及详情页页面的具体问题内容
在这里插入图片描述
此次项目主要使用到的是Python中的lxml库,使用它可以轻松处理XML和HTML文件,还可以用于web爬取。

项目准备

如果自己电脑环境还没有lxml这个库的同学,可以在终端使用下面的命令进行相应的安装

// 如果要安装其他的库,只需要将下面的lxml替换成相应的库即可
pip install  lxml

安装案例截图
在这里插入图片描述
本项目还会涉及到requests这个库
如果也没有,请遵循以上方法

项目源代码

from lxml import etree
import  requests
#要爬取的链接
url1='https://ask.csdn.net/?utm_source=homepage&spm=1002.2000.3001.9196'

#爬虫头文件,用于伪装
headers = {
        'user-agent':
            'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'
    }
res=requests.get(url1,headers=headers)
yemadata=res.text
html1=etree.HTML(yemadata)
#定义爬取的问题数量,这里我暂定的十个
page =10
# yema=html1.xpath('//*[@id="__layout"]/main/div/div/div[2]/div[2]/div/div[1]/div/p/text()')
# print(yema)
# tbale=html1.xpath('//*[@id="__layout"]/main/div/div/div[2]/div[2]/div/div[1]/div/div[1]/a/@href')
titleinfo=[]
for number in range(page):
  yema =html1.xpath('//*[ @id="__layout"]/main/div/div/div[2]/div[2]/div/div'+ str([number + 1]) +'/div/div[1]/a/h2/text()')
  yema =str(yema).replace("'",'')
  titleinfo.append(yema)
for yemaint in range (page):
  #获取问题详情子页面的链接和问题的标题
  urls=html1.xpath('//*[@id="__layout"]/main/div/div/div[2]/div[2]/div/div'+ str([yemaint + 1]) +'/div/div[1]/a/@href')
  #url代表每个主页问题的详情页面链接
  #这里是通过replace来对获取到的内容,将不重要的内容进行替换
  url=str(urls).replace("['",'').replace("']",'')
  #打印问题标题和详情页链接
  print(titleinfo[yemaint]+'\t'"链接地址:"+url)

  #获取问题的ID属性
  questionID=url.replace('https://ask.csdn.net/questions/','')

  #子页面请求,获取详情问题的内容
  request=requests.get(url)
  yemadata=request.text
  html2=etree.HTML(yemadata)
  quest = html2.xpath('//*[@id="content-'+questionID+'"]/div/p/text()')
  #问题内容
  question =str(quest).replace("'",'').replace(' ','').replace('[','').replace(']','').replace(',','')
  if len(question)!=0:
    print('代号' + questionID + '问题:'+question+'')
    print()
  else:
    print('代号' + questionID +'涉及图片处理,目前暂不支持')
    print()

运行效果展示

在这里插入图片描述
通过代码运行,我们想要的结果就呈现到了我们的终端。

项目扩展优化

上面我们通过运行项目,将我们的所爬取的数据在终端进行了展示。这里就有同学表示,这样的展示效果看着不过瘾!
那好,我们通过将爬取的数据进行传递,在我们的HTML前端展示出来。
在这里插入图片描述
后面运用Flask库实现数据呈现在web网页。虽然没有CSS修饰丑陋了一点,但是要实现的要求还是完成了。
后面还可以直接通过a标签访问到问题的来源。

修改后的代码如下:有需要的朋友可以借鉴

from flask import Flask, render_template
from lxml import etree
from lxml import etree
import requests
import openai
import requests

url1 = 'https://ask.csdn.net/?utm_source=homepage&spm=1002.2000.3001.9196'

headers = {
    'user-agent':
        'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'
}
QuestionList = []
StrList = []
anser = []
res = requests.get(url1, headers=headers)
yemadata = res.text
html1 = etree.HTML(yemadata)
page = 10
# yema=html1.xpath('//*[@id="__layout"]/main/div/div/div[2]/div[2]/div/div[1]/div/p/text()')
# print(yema)
# tbale=html1.xpath('//*[@id="__layout"]/main/div/div/div[2]/div[2]/div/div[1]/div/div[1]/a/@href')
titleinfo = []
for number in range(page):
    yema = html1.xpath(
        '//*[ @id="__layout"]/main/div/div/div[2]/div[2]/div/div' + str([number + 1]) + '/div/div[1]/a/h2/text()')
    yema = str(yema).replace("'", '')
    titleinfo.append(yema)
for yemaint in range(page):
    # 获取问题子页面的域名和问题的标题
    urls = html1.xpath(
        '//*[@id="__layout"]/main/div/div/div[2]/div[2]/div/div' + str([yemaint + 1]) + '/div/div[1]/a/@href')
    url = str(urls).replace("['", '').replace("']", '')

    # print(titleinfo[yemaint]+'\t'"链接地址:"+url)

    # 获取问题的ID属性
    questionID = url.replace('https://ask.csdn.net/questions/', '')

    # 子页面请求
    request = requests.get(url)
    yemadata = request.text
    html2 = etree.HTML(yemadata)
    yema = html2.xpath('//*[@id="content-' + questionID + '"]/div/p/text()')
    # 问题内容
    question = str(yema).replace("'", '').replace(' ', '').replace('[', '').replace(']', '').replace(',', '')
    if len(question) != 0:
        StrList.append(url)
        QuestionList.append(question)
    #   print('代号' + questionID + '问题:'+question+'')
    #   print()
    # else:
    #   print('代号' + questionID +'涉及图片处理,目前暂不支持')
    #   print()

app = Flask(__name__)
@app.route('/')
def index():
    # render_template方法:渲染模板
    # 参数1: 模板名称  参数n: 传到模板里的数据
    return render_template('index.html',
                           my_url=StrList,
                           my_int=QuestionList,
                           )
if __name__ == '__main__':
    app.run(debug=True)

以上是python的代码

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>CSDN问题内容</title>
</head>
<body>
  <h2>爬取问题集合</h2>
  {{ my_int[0] }} <a href="{{my_url[0]}}">源问题地址</a>
  <br><hr>
  {{  my_int[1] }} <a href="{{my_url[1]}}">源问题地址</a>
  <br><hr>
  {{  my_int[2] }} <a href="{{my_url[2]}}">源问题地址</a>
  <br> <hr>
  {{ my_int[3] }} <a href="{{my_url[3]}}">源问题地址</a>
   <br> <hr>
  {{ my_int[4] }} <a href="{{my_url[4]}}">源问题地址</a>
   <br> <hr>
  {{ my_int[5] }} <a href="{{my_url[5]}}">源问题地址</a>
<hr>
</body>
</html>

HTML代码
因为我使用的是Flask库的模板功能,所以HTML前端的页面一定要像下面这样在这里插入图片描述
html页面一定要放在templates目录下,这样才可以访问到。
如果有什么问题,可以后台进行私信我!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ctrl+c程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值