欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python爬虫实战小案例, requests + Xpath解析 【附源码】

程序员文章站 2022-07-10 21:36:45
提取页面信息时使用的是正则表达式,这还是比较烦琐,万一有地方写错了,可能导致匹配失败,所以使用正则表达式提取页面信息、多多少少还是有些不方便 。XPath ,Beautiful Soup ,pyquery 都是不错的选择 。这次举一个 XPath的实战案例爬取豆瓣图书 Top榜 ,并将爬取的数据保存成 CSV文件文件如图 :一、网页分析①、根据每一页的 URL 可以发现规律 ,每次都是 start 发生变化,而且每次变化 25 【25是每页的书籍数】②、通过浏览器 来获取 所需要...

  提取页面信息时使用的是正则表达式,这还是比较烦琐,万一有地方写错了,可能导致匹配失败,所以使用正则表达式提取页面信息、多多少少还是有些不方便 。
  XPath ,Beautiful Soup ,pyquery 都是不错的选择 。

这次举一个 XPath的实战案例


爬取豆瓣图书 Top榜 ,并将爬取的数据保存成 CSV文件

文件如图 :
Python爬虫实战小案例, requests + Xpath解析 【附源码】

一、网页分析

①、根据每一页的 URL 可以发现规律 ,每次都是 start 发生变化,而且每次变化 25 【25是每页的书籍数】
Python爬虫实战小案例, requests + Xpath解析 【附源码】
②、通过浏览器 来获取 所需要的信息的 XPath信息
Python爬虫实战小案例, requests + Xpath解析 【附源码】

二、源代码

from lxml import etree
import requests
import csv


def beginCrawl():
    list_all_book_data = []  # 列表,用来保存所有的书籍信息
    for i in range(0, 250, 25):  # 信息分布在 10个页面
        url = 'https://book.douban.com/top250?start=' + str(i);
        one_page = crawlOnePage(url)
        list_all_book_data.extend(one_page)
    saveToCSV(list_all_book_data)  # 调用函数,保存成CSV


def crawlOnePage(url):
    headers = {  # 模拟浏览器, 防止相关网站的反爬虫
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
    }
    response = requests.get(url, headers=headers)
    target_text = response.text

    html = etree.HTML(target_text)

    data = html.xpath('//tr[@class="item"]')  # 首先获取 每一个书籍 (item)

    list_each_page = []

    # 使用 XPath 对每一个 书籍Item 进行解析
    for item in data:
        info = {}
        bookName = item.xpath("./td[2]/div/a/@title")[0]
        bookInfo = item.xpath("./td[2]/p/text()")[0].split('/')
        author = bookInfo[0]  # 作者
        printTime = bookInfo[-2]  # 出版时间
        price = bookInfo[-1]  # 价格
        forewords = item.xpath("./td[2]/p[2]/span/text()")  # 书籍语录
        foreword = forewords[0] if len(forewords) == 1 else ' '

        info['bookName'] = bookName
        info['author'] = author
        info['printTime'] = printTime
        info['Price'] = price
        info['foreword'] = foreword
        list_each_page.append(info)
    return list_each_page


def saveToCSV(list_each_page):
    with open('豆瓣书籍top榜.csv', 'w', encoding='utf-8-sig', newline='')as f:   # 使用 utf-8-sig 防止打开文件乱码
        wirter = csv.DictWriter(f,
                                fieldnames=['bookName', 'author', 'printTime', 'Price', 'foreword'])
        wirter.writeheader()  # 写入表头
        for each in list_each_page:
            wirter.writerow(each)


if __name__ == '__main__':
    beginCrawl()

本文地址:https://blog.csdn.net/VariatioZbw/article/details/107361271