Python爬虫学习笔记 1-2:初识Python爬虫
Published On 2019/08/11 Sunday, Singapore
本节以爬取小王子的豆瓣短评为例,从以下三个方面来初步了解爬虫: 1 数据获取 2 网页解析 3 数据保存
本文为Datacatsle Python爬虫(入门+进阶)课程学习笔记。
数据获取
网页爬取的第一步是获取数据(网页源代码),常用的爬虫库包含: urllib库和requests库。urllib库为python自带库,而request库为第三方库。以下分别给出使用两个库爬取豆瓣短评的例子。
urllib库
#导入urllib.request
import urllib.request
#打开网址,返回一个类文件对象
url = 'https://book.douban.com/subject/1084336/comments/'
f = urllib.request.urlopen(url)
#f.read()得到的格式为byte,因此修改编码为utf-8使其为string
#保存到result
result = f.read().decode('utf-8')
requests库有以下两种用法:
- requests.get() 获取HTML网页的主要方法,对应于HTTP的GET
- requests.post() 向HTML网页提交POST请求的方法,对应于HTTP的POST
请求返回的结果为response,response对象的属性
- status_code:http请求的返回状态,200表示连接成功(阅读HTTP状态码,了解各状态码含义)
- text:返回对象的文本内容
- content:猜测返回对象的二进制形式
- encoding:分析返回对象的编码方式
- apparent_encoding:响应内容编码方式(备选编码方式)
#导入requests库
import requests
#使用requests.get方法获取网页信息
url = 'https://book.douban.com/subject/1084336/comments/'
f= requests.get(url)
# 检查返回结果编码方式,发现其为'utf8'
print(f.text.encoding)
# 保存到result
result = f.text
网页解析
在通过 urllib/requests 获取到网页源代码以后,我们需要对网页进行解析以获取到需要的数据。 常用的解析方法包括:
- 正则表达式
- BeautifulSoup
- Xpath 即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。 XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。起初XPath的提出的初衷是将其作为一个通用的、介于XPointer与XSL间的语法模型。但是XPath很快的被开发者采用来当作小型查询语言。
from lxml import etree
s = etree.HTML(r)
file = s.xpath('//div[@class="comment"]/p/span/text()')
数据保存
- with open()
import requests
from lxml import etree
url = 'https://book.douban.com/subject/1084336/comments/'
r = requests.get(url).text
s = etree.HTML(r)
file = s.xpath('//div[@class="comment"]/p/span/text()')
with open('pinglun.txt', 'w', encoding='utf-8') as f: #使用with open()新建对象f
for i in file:
print(i)
f.write(i) #写入数据,文件保存在当前工作目录
可以使用以下方法得到当前工作目录或者修改当前工作目录
import os
os.getcwd()#得到当前工作目录
os.chdir()#修改当前工作目录,括号中传入工作目录的路径
Pandas
df.to_excel('data.xlsx')
df.to_csv('data.csv') #保存中文时要更改编码格式:encoding='gbk',或者其他格式
完整案例
# 导入requests
import requests
# 使用requests.get获取网页源码
r = requests.get('https://book.douban.com/subject/1084336/comments/').text
#导入bs4
from bs4 import BeautifulSoup
#解析网页数据
soup = BeautifulSoup(r,'lxml')
#寻找数据
pattern = soup.find_all('span','short')
#for循环打印
for item in pattern:
print(item.string)
#导入pandas
import pandas
# 新建list对象
comments = []
for item in pattern:
comments.append(item.string)
df = pandas.DataFrame(comments)
# 使用to_csv写入
df.to_csv('comments.csv')