[6]个人学习python:爬取CSDN的Oracle论坛,并保存到本地txt文档

代码如下:

# -*- coding: utf-8 -*
import urllib.request,socket,re,sys,os,time,requests
from lxml import etree
with open(r'C:\Users\admin\Desktop\practice_csdn.txt','w') as f:
    for p in range(1,3):                      #range(1,3),代表第一页,第二页
        url='https://bbs.csdn.net/forums/Oracle?page={}'.format(p)
        headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
            'Referer': 'https://bbs.csdn.net/forums/Oracle'}
        response=requests.get(url=url,headers=headers)
        response.encoding='utf-8'
        html=response.text
        s=etree.HTML(html)
        time.sleep(2)
        block=s.xpath('//*[@id="forums-show"]/div[3]/div[1]/div/dl/dt/h1/text()')[0]
        f.write('论坛名称:{}'.format(block)),f.write('\n')
        f.write('第{}页:\n'.format(p)),f.write('*'*120),f.write('\n')
        cmax=0
        pimax=s.xpath('//*[@id="forums-show"]/div[3]/div[4]/table/tr')      #结构是一个table下面多个tr,每条信息在tr里面,所以用tr
        for pimaxx in pimax:
            cmax=cmax+1
        print (cmax)                #获取总条目,结果是53,比最后一条xpath[]52大1,所以接下来用‘<’
        count=2                     #第一个标题的xpath是2,用while循环加format()方法更方便
        while count<cmax :
            title= s.xpath('//*[@id="forums-show"]/div[3]/div[4]/table/tr[{}]/td[1]/a/text()'.format(count))[0]
            sort=  s.xpath('//*[@id="forums-show"]/div[3]/div[4]/table/tr[{}]/td[1]/span/a/text()'.format(count))[0]
            score= s.xpath('//*[@id="forums-show"]/div[3]/div[4]/table/tr[{}]/td[2]/text()'.format(count))[0]
            writer=s.xpath('//*[@id="forums-show"]/div[3]/div[4]/table/tr[{}]/td[3]/a/@title'.format(count))[0]
            wtime= s.xpath('//*[@id="forums-show"]/div[3]/div[4]/table/tr[{}]/td[3]/span/text()'.format(count))[0]
            count=count+1
            time.sleep(1)
            print ('标题:{}[{}]\n分数:{}  提问人:{}  提问时间:{}\n'.format(title,sort,score,writer,wtime),'*'*50)
            f.write('标题:{}[{}]\n分数:{}  提问人:{}  提问时间:{}\n'.format(title,sort,score,writer,wtime)),f.write('*'*50),f.write('\n')
        f.flush()

结果如下:


分析:

1、这里的关键点就在于灵活地处理xpath,灵活地运用;

2、浏览器复制的xpath并不一定是对的,需要自己去页面代码查看!

3、注意查看网页的编码,是否需要转码,最好习惯性用转码:str转成bytes用encode,bytes转成str用decode。这里因为是get()方法,数据只包含str格式,所以只能用encode()方法。简记:gse,ubd!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值