《python爬虫学习》之爬取csdn网站的博主文章列表

前言:

上一篇文章,采用爬取接口的方法爬取到的文章数量只有十篇,但我们看到的文章却不止十篇,甚至点刷新之后会不断增加,而且之前的文章还存在,这说明虽然接口一次只传十条数据,但页面会将已接收的数据缓存到本地,增加到页面中,大概是这样。

 

爬取接口的方法比较简单,只要将要传递的参数陈列分析出来,基本都能获取后台返回给前端的数据。不过很多网站的数据是找不到对应接口的,这时候就需要使用其他的方法来爬取数据,例如xPath。这里以csdn博主文章栏目为例子练习

 步骤1:进入开发者模式

随便找一个比较厉害的大佬,进他的文章列表,使用F12进入开发者模式。

步骤2: 分析页面

通过移动鼠标到左边的代码上,可以看到页面出现蓝色半透明层覆盖页面一部分内容。而我们所要爬取的数据就在这里。

分析后,我们可以知道我们要爬取的内容路径为:div[@class="article-list"]下的div[@class=” article-item-box csdn-tracking-statistics”]下的h4中。

 

步骤3:xpath语句 

通过上面分析,我们大致知道我们要爬取的内容所在的位置,也能轻易推敲出我们的xpath语句:

//*/div[@class="article-list"]/div/h4

这里xpath的写法可以有很多中,如果实在不知道怎么写,也可以直接用copy XPath方法获取,然后稍微修改即可。

 

步骤4:写爬虫 

完成上面步骤,我们就可以开始写我们的爬虫。

from urllib import request

url="https://blog.csdn.net/博主id"
html=request.urlopen(request.Request(url)).read().decode('utf8')
print(html)
# 这里打印出来看看对不对
f = open('c.html', 'w', encoding='utf8')
f.write(html)
f.close()

 

这爬取的内容是整一个页面的内容,而我们使用xPath的目的就是为了从中提炼出我们要的数据。

from urllib import request
from lxml import etree

url="https://blog.csdn.net/ThinkWon"
html=request.urlopen(request.Request(url)).read().decode('utf8')


htmls=etree.HTML(html)
result=htmls.xpath('//*/div[@class="article-list"]/div/h4')

for res in result:
    # 地址比较简单,就直接取a标签里的的href内容就行
    url=res.xpath('a/@href')[0]
    # 直接爬取text()会把空格和换行算作字符,所以需要提取一下
    title = res.xpath('a/text()')[1].replace(' ','')
    print(f'{title}:{url}')

打印结果 :

 

当然,这里爬取的文章只是第一页的内容,如果自己关注的博主文章写的多,明显以上代码并不能爬取博主其他页的文章。那么怎么解决这个问题呢?

其实点击第二页或者下一页时,url地址就会发生改变,而我们点回第一页时,url就不是我们最初进入该博主的文章页的url,而是真正的url:https://blog.csdn.net/博主Id/article/list/页数

所以要爬取其他页的文章,我们只需将url的改变一下即可:

url=‘https://blog.csdn.net/博主id/article/list/‘+page

步骤5:写入excel表格

from urllib import request
from lxml import etree
import xlwt
url="https://blog.csdn.net/thinkwon/article/list/2"
html=request.urlopen(request.Request(url)).read().decode('utf8')

htmls=etree.HTML(html)
result=htmls.xpath('//*/div[@class="article-list"]/div/h4')

workbook=xlwt.Workbook()
sheet=workbook.add_sheet('csdn博主文章')
sheet.write(0,0,'标题')
sheet.write(0,1,'文章地址')
i=0
for res in result:
    i+=1
    url=res.xpath('a/@href')[0]
    title = res.xpath('a/text()')[1].replace(' ','')
    sheet.write(i, 0, title)
    sheet.write(i, 1, url)
workbook.save('csdn.xls')

运行结果:

步骤6:重构

完成上面步骤,我们就获得了我们需要爬取的数据,基本就可以收工了。不过为了代码的简洁性,即使代码量不多,我还是将重新整理了一下 

from urllib import request
from lxml import etree
import xlwt
import ssl
import random
#添加user-agent用户代理
ua_list=['Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6726.400 QQBrowser/10.2.2265.400',
         'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36',
         'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36',
         'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11'
        'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER',
         'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0',
         'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.3.4000 Chrome/30.0.1599.101 Safari/537.36',
         'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 UBrowser/4.0.3214.0 Safari/537.36'
         ]
xPathStr='//*/div[@class="article-list"]/div/h4'
# 读取网站
def readURL(url):
    user_agent=random.choice(ua_list)
    headers={'User-Agent':user_agent}
    context=ssl._create_unverified_context()
    html = request.urlopen(request.Request(url,headers=headers),context=context).read().decode('utf8')
    return html
# xpath节点获取并写入表格
def htmlxPath(html,sheet,i):
    htmls = etree.HTML(html)
    result = htmls.xpath(xPathStr)
    for res in result:
        i += 1
        url = res.xpath('a/@href')[0]
        title = res.xpath('a/text()')[1].replace(' ', '')
        sheet.write(i, 0, title)
        sheet.write(i, 1, url)
    return i

def articleSpider(url,beginPage,endPage):
    workbook = xlwt.Workbook()
    sheet = workbook.add_sheet('csdn博主文章')
    sheet.write(0, 0, '标题')
    sheet.write(0, 1, '文章地址')
    i=0
    for page in range(beginPage,endPage+1):
        # 拼接地址,?t=1表示栓选原创文章
        fullurl=f'{url}{page}?t=1'
        html=readURL(fullurl)
        i=htmlxPath(html,sheet,i)
    workbook.save('csdn.xls')

if __name__=='__main__':
    bloggerId=input('请输入要爬取的博主Id:')
    beginPage=int(input('请输入开始的页数:'))
    endPage=int(input('请输入结束的页数:'))
    url=f'https://blog.csdn.net/{bloggerId}/article/list/'
    articleSpider(url,beginPage,endPage)

爬取结果:

 

 写到这里,csdn博主文章的爬取练习就算是完成了。

然后在这里,希望自己能早日找到工作,早点到新的公司里学习新的技术,加油!

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值