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文件
文件如图 :
一、网页分析
①、根据每一页的 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
上一篇: layui的iframe父子操作方法
下一篇: VIM编辑器常用指令