当前位置: 移动技术网 > IT编程>脚本编程>Python > Python爬虫实战小案例, requests + Xpath解析 【附源码】

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

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

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

这次举一个 XPath的实战案例


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

文件如图 :
在这里插入图片描述

一、网页分析

①、根据每一页的 URL 可以发现规律 ,每次都是 start 发生变化,而且每次变化 25 【25是每页的书籍数】
在这里插入图片描述
②、通过浏览器 来获取 所需要的信息的 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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网