1半自动爬虫

本文介绍了Python半自动爬虫的工作原理,通过文件操作和正则表达式来抓取并解析网页内容。讲解了如何读写文件、处理CSV数据,以及使用正则表达式提取特定信息。示例中展示了从飞卢小说网爬取评论列表,包括用户名、评论内容和日期,并将数据保存到CSV文件的过程。
摘要由CSDN通过智能技术生成

仅为笔记

半自动爬虫

半自动字面意思就是不能全自动,需要手动把需要爬取的页面源码复制到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
  1. ’*‘替换所有字符
  2. ‘.’替换一个字符
  3. '?'问号表示它前面的子表达式0次或者1次
  4. \d占位一个数字 \d*无限数字
  5. '()'用于提取数局,括号内放如需要读入的关键数据,括号外则是不需要读入的关键数据
  6. 匹配数据内有单引号则用双引号包含,有双引号则用单引号包含
  7. 在用正则表达式匹配小括号()时,应将括号用[]包起来
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)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

最后一只三脚兽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值