爬虫流程
- 定义url,伪造headers
- 请求数据
- 解析数据
- 提取数据
- 持久化保存
实例
import requests
from lxml import etree
import time
import csv
# 1,定义url,伪造headers
url = "https://fm.qq.com/category/39087_38979"
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36"
}
# 2,请求数据
response = requests.get(url=url,headers=headers).text
# 3,解析数据
tree = etree.HTML(response)
html_li = tree.xpath('//*[@id="j-album-list"]/li')
with open('糗百.csv', 'w', encoding='gbk', newline='') as f: # 创建文件对象(指定文件名,模式,编码方式)
csv_writer = csv.writer(f) # 基于文件对象构建 csv写入对象
csv_writer.writerow(["标题", "图片url", "内容"]) # 构建列表头
for li in html_li:
time.sleep(0.5)
# 4,提取数据
title = li.xpath('./div[2]/div/div[1]/a/text()')[0]
image_url = li.xpath('./div[1]/img/@src')[0]
content = li.xpath('./div[2]/div/div[2]/text()')[0]
# 5、写入数据
csv_writer.writerow([title, image_url, content]) # 写入csv文件内容
print('写入成功:{0}'.format(title))
f.close() # 关闭文件
文件预览
总结:
我在本次爬取数据中遇到过两个问题。
第一个问题是打印的时候没有乱码,但保存在文件中打开的时候中文乱码了
解决方法是在open函数中增加了这个属性 encoding="gbk",如果不行的话可以试一下其他编码方式,中文编码常用的有 gbk、gb2312、utf-8。多试试总有一个可以,如果是打印的时候乱码了就得在请求后面加行代码 encoding = "gbk" (网页源码head标签中的charset属性决定编码方式)
第二个问题是保存在csv文件的时候每行之间有空行
解决方法是在open函数中增加这个属性 newline="" (空串)
打卡第58天,对python大数据感兴趣的朋友欢迎一起讨论、交流,请多指教!