python xpath爬取豆瓣图书Top 250存入csv文件并解决csv乱码问题

我上次分享过关于爬取豆瓣电影top250的实战:BeautifulSoup爬取豆瓣电影top250信息python BeautifulSoup爬取豆瓣电影top250信息并写入Excel表格 ,豆瓣网没有反爬虫机制,对于学习爬虫的小白是一个不错的学习对象,python xpath我是初步学习,对豆瓣图书 Top 250 进行实战学习,xpath的优点之一就是可以直接复制获取信息的节点,如图:
在这里插入图片描述
我要爬取的数据还是比较全面的,几乎都没有放过,有(排名,书名,地址,作者,翻译,星级,评分,评价,单价,出版社,出版日期,国家,评价),其中“排名”在网页上没有,需要自己加上去,相比于豆瓣电影,豆瓣图书的坑更多。

爬豆瓣图书需要注意的几个坑!!!

1、图书在top250的排名
2、从p标签中截取作者、翻译者
3、获取星级数
4、截取国家
5、评价
6、csv乱码 (其实没错,就是乱码)


下面来讲解一下我解决这几个坑的的思路:

1、图书在top250的排名

在网页中没有显示它的排名,但我们都知道它是降序排的,从1~250,所有就直接通过循环写进csv就行了,但是初始值一定不能放在循环函数内,否则它就会被重新赋值或者只输出一个值,正确方法如下:
在这里插入图片描述

2、从p标签中截取作者、翻译者

这些信息都在p标签中,但国外的著作和国内的排布不一样,国外的会有翻译者在其中,中国的就只有作者一个,排名31的《倾城之恋》就没有作者。
2.1、国外著作p标签内容为:

<p class="pl">[国家] 作者 / 翻译者 / 出版社 /出版日期 / 价格</p>

国外的著作
获取的方法:
在这里插入图片描述
2.2、国内著作p标签内容为:

<p class="pl">作者 / 出版社 /出版日期 / 价格</p>

在这里插入图片描述
获取的方法:
在这里插入图片描述
2.3、没有作者的情况:
在这里插入图片描述
获取的方法:
(1)先对p标签分割成字符串
(2)len(p1.split(’/’)) 算出字符串的长度,这里的3是我先计算出来的,如果字符串长度等于3,说明它没有作者。

        elif len(p1.split('/'))==3:
            author = ' '
3、获取星级数

注意: 字符串不能直接被除,需要转化为int型
在这里插入图片描述
在这里插入图片描述

4、截取国家

只要会截取作者和翻译者,这个问题就不大了。也是通过“[外国]”来判断它的国籍的,中国的都没有写出来,所有没有“[ ]”的,我全部默认为中国,包括没有作者的。

        #截取国家
        if '[' in p1:            
            country = p1.split('[')[1]
### Python 爬虫抓取豆瓣 Top250 电影信息保存至 CSV 文件 为了实现这一功能,可以采用 `requests` `lxml` 库解析网页内容,利用 `pandas` 或者内置的 `csv` 模块将获取的信息写入 CSV 文件。下面是一个完整的代码示例: ```python import requests from lxml import etree import pandas as pd def fetch_page(url): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } response = requests.get(url, headers=headers) if response.status_code == 200: return response.text else: raise Exception(f'Failed to load page {url}') def parse_html(html_content): tree = etree.HTML(html_content) movies = [] items = tree.xpath('//ol[@class="grid_view"]/li') for item in items: title_chinese = item.xpath('.//span[@class="title"][1]/text()')[0] try: title_english = item.xpath('.//span[@class="other"]/text()')[0].replace('/', '').strip() except IndexError: title_english = '' link = item.xpath('.//a/@href')[0] info_text = ''.join(item.xpath('.//div[@class="bd"]//p[1]/text()')).split('\n')[0].strip().split() director_and_casts = " ".join(info_text).split('...')[:-1][0] year = item.xpath('.//div[@class="bd"]//p[1]/text()[last()]')[0].strip().strip('()') country_type_info = "".join(item.xpath('.//div[@class="bd"]//p[1]/text()[last()-1]')) nationality = country_type_info.split('/')[1].strip() movie_types = '/'.join(country_type_info.split('/')[-1].strip().split()) rating_score = item.xpath('.//span[@class="rating_num"]/text()')[0] num_of_ratings = item.xpath('.//div[@class="star"]/span[last()]/text()')[0].strip('人评价') single_movie_data = [ title_chinese, title_english, link, director_and_casts, year, nationality, movie_types, rating_score, num_of_ratings ] movies.append(single_movie_data) return movies def save_to_csv(data_list, filename='douban_top250.csv'): df = pd.DataFrame( data=data_list, columns=['中文名称', '外文名称', '详情链接', '导演与演员', '年份', '国家地区', '类型', '评分', '评论人数'] ) df.to_csv(filename, index=False, encoding='utf-8-sig') if __name__ == '__main__': base_url = 'https://movie.douban.com/top250?start={}&filter=' all_movies = [] for i in range(10): # 总共十页 url = base_url.format(i * 25) html = fetch_page(url) parsed_items = parse_html(html) all_movies.extend(parsed_items) print(f'Successfully fetched and parsed page {i + 1}') save_to_csv(all_movies) print('All pages have been successfully processed.') ``` 此脚本会遍历每一页的 URL,提取所需字段,最终把所有收集到的数据存入名为 `douban_top250.csv` 的文件中[^2]。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值