仅为笔记
半自动爬虫
半自动字面意思就是不能全自动,需要手动把需要爬取的页面源码复制到txt文件中利用文件操作完成爬取
python文件操作
# 方法一(缺点:需要手动关文件)
f = open('文件路径','文件操作方式',encoding = '解码方式')
f.close()
#方法二,利用上下文管理器(缩进结束后自动关闭文件)
with open('文件路径','文件操作方式',encoding = '解码方式') as f:
#对文件进行操作
文件读取和写入
#不加操作方式默认为读取即'r'
with open('comments.txt',encoding='utf-8') as f:
f.readlines()#将所有数据变为一个字符串
f.read()#按原格式读入
#写入数据
with open('comments.txt','w',encoding='utf-8') as f:
f.write("一大段文字")
f.writelines(['第一段话'],['第二段话'],['第三段话'])#注意,需要用\n手动换行
使用Python读/写CSV文件
需要import csv
读取csv文件
#读取csv文件
with open('comments.csv',encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:#for循环内的row是有序字典
print(row)
#在缩进外部利用列表推导式读取数据
with open('comments.csv',encoding='utf-8') as f:
reader = [x for x in csv.DictReader(f)]
for row in reader:#for循环内的row是有序字典
print(row)
写入csv文件
#Python写CSV文件时需要用到csv.DictWriter()这个类。
#它接收两个参数:第1个参数是文件对象f;第2个参数名为fieldnames,值为字典的Key列表。
writer = csv.DictWriter(f,fieldnames={'表头1','表头2','表头3'})
writer.writeheader()#写入表头
writer.writerows(包含字典的列表)
writer.writerow(包含字典的列表)
正则表达式
import re
- ’*‘替换所有字符
- ‘.’替换一个字符
- '?'问号表示它前面的子表达式0次或者1次
- \d占位一个数字 \d*无限数字
- '()'用于提取数局,括号内放如需要读入的关键数据,括号外则是不需要读入的关键数据
- 匹配数据内有单引号则用双引号包含,有双引号则用单引号包含
- 在用正则表达式匹配小括号()时,应将括号用[]包起来
re.findAll(pattern,string,flags=0)#pattern表示正则表达式,string表示原来的字符串,flags表示一些特殊功能的标志。
#findall的结果是一个列表,包含了所有的匹配到的结果。如果没有匹配到结果,就会返回空列表
#search()的用法和findall()的用法一样,但是search()只会返回第1个满足要求的字符串。一旦找到符合要求的内容,它就会停止查找。
re.search(pattern,string,flags=0)
在爬虫的开发过程中非常容易出现这样的情况,要匹配的内容存在换行符“\n”。要忽略换行符,就需要使用到“re.S”这个flag
-
“.*”:贪婪模式,获取最长的满足条件的字符串。*
-
“.*? ”:非贪婪模式,获取最短的能满足条件的字符串。
使用.group()读取数据
只有在.group()里面的参数为1的时候,才会把正则表达式里面的括号中的结果打印出来。.group()的参数最大不能超过正则表达式里面括号的个数。参数为1表示读取第1个括号中的内容,参数为2表示读取第2个括号中的内容,以此类推,如图3-5所示。
半自动爬虫测试,爬取飞卢小说网的评论列表
import csv
import re
with open('Feilu.txt',encoding='utf-8') as f:
source = f.read()
data_list=[]
username_list = re.findall("c_NickName='(.*?)'",source,re.S)
comment_list = re.findall(">show_comment_content[(]' (.*?)'",source,re.S)
date_list = re.findall("class='item_footer2'>(.*?)<",source,re.S)
for i in range(len(username_list)):
data = {'username':username_list[i],
'comment':comment_list[i],
'date':date_list[i]}
data_list.append(data)
with open("Feilu.csv",'w',encoding='utf-8') as f:
writer = csv.DictWriter(f,fieldnames={'username','comment','date'})
writer.writeheader()
writer.writerows(data_list)