爬虫---lxml爬取博客文章

  上一篇大概写了下lxml的用法,今天我们通过案例来实践,爬取我的博客博客并保存在本地

爬取博客园博客

爬取思路:

1、首先找到需要爬取的博客园地址

2、解析博客园地址

# coding:utf-8
import requests
from lxml import etree
# 博客园地址
url = 'http://www.cnblogs.com/qican/'
headers = {
    "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36"
}
html =requests.get(url,headers=headers).text
# 解析html内容
xml = etree.HTML(html)

3、通过博客名称抓取博客标题和详情链接。

经过分析数据我们需要a标签下的文字和href内容

# 标题
title_list = xml.xpath('//div[@class="postTitle"]/a/text()')
# 链接url
url_list = xml.xpath('//div[@class="postTitle"]/a/@href')

4、再次请求博客详情链接获取博客内容

通过for循环获取到标题,链接内容,然后再次请求博客链接获取博客内容

for i,j in zip(title_list,url_list):
    # 再次请求博客链接
    r2 = requests.get(j,headers=headers).text
    # 解析内容
    xml_content = etree.HTML(r2)
    # 获取博客内容
    content = xml_content.xpath('//div[@class="postBody"]//text()')

5、获取的博客内容写入到txt文件中。

通过with写入txt文件中,这里注意内容的编码格式

for x in content:
        print(x.strip())
        with open(i+'.txt','a+',encoding='utf-8')as f:
            f.write(x)

写到这里发现我们都已经把博客内容写入了txt文件中,当然了这只是其中第一页的内容,我们通过观察url链接,发现分页是有page控制的,我们来模拟page数据获取全部博客内容

代码如下:

通过for循环获取模拟分页

# coding:utf-8
import requests
from lxml import etree
# 通过循环模拟url分页
for page in range(1,4):
# 博客园地址
    url = 'https://www.cnblogs.com/qican/default.html?page=%s'%page
    print(url)
    headers = {
        "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36"
    }
    html =requests.get(url,headers=headers).text
    # 解析html内容
    xml = etree.HTML(html)
    # 标题
    title_list = xml.xpath('//div[@class="postTitle"]/a/text()')
    # 链接url
    url_list = xml.xpath('//div[@class="postTitle"]/a/@href')
    for i,j in zip(title_list,url_list):
        print(i)
        # 再次请求博客链接
        r2 = requests.get(j,headers=headers).text
        # 解析内容
        xml_content = etree.HTML(r2)
        # 获取博客内容
        content = xml_content.xpath('//div[@class="postBody"]//text()')
        # 写入内容
        for x in content:
            print(x.strip())
            with open(i+'.txt','a+',encoding='utf-8')as f:
                f.write(x)

简单的通过案例又一次加深了lxml的用法,当然方法很多种,喜欢哪种用哪种。~~~

原文地址:https://www.cnblogs.com/qican/p/11264889.html