Python爬虫系统化学习(4)

在之前的学习过程中,我们学习了如何爬取页面,对页面进行解析并且提取我们需要的数据。

在通过解析得到我们想要的数据后,最重要的步骤就是保存数据。

一般的数据存储方式有两种:存储在文件或者数据库中。在本篇博客中我会细致的讲解从零基础到血会存储在txt或者csv文件,以及通过PHPstudy去保存数据。

Python文件存储

首先我们来写一组最简单的代码,实现的功能是打开C盘目录下的a.txt,并且写入"hello python",然后关闭文件。代码如下:

content="hello python"
with open('C:\\a.txt',"a+") as f:
f.write(content)
f.close()

这里有个细节是C:\是两个反斜杠,这是因为转义的原因。通常地址的三种表现形式:

open('D:\\Data\\a.txt',"a+")
open(r'D:\Data\a.txt',"a+")
open('D:/Data/a.txt',a+)

一个重点是我们要知道文件的本质是句柄,他是文件的唯一标识符。我们每次打开一个文件,都会在系统中生成一个用数字表示的句柄,这串数字表示应用程序所代表的一系列内容。我们在记事本内写东西就是代表着我们对句柄所代表的内容进行输入。

我们可以查看下上述代码打开a.txt文件的句柄,在原有代码之下输入一下代码:

print(f)
#输出内容:<_io.TextIOWrapper name='D:\\a.txt' mode='a+' encoding='cp936'>
此后对f的操作就是对a.txt的操作

所以对文件的操作都是在句柄上进行的,常用的文件处理方法及属性列表如下

方法:

方法名 作用 使用方法(举例)
open 打开一个文件,创建一个file对象,相关的方法可以调用它进行读写 file=open('a.txt',"a+")
close 刷新缓冲区中任何没写入的信息,并且关闭文件,此后信息就不会写入 file.close()
write 将任何字符写入打开的文件,不仅仅是文字也可以是二进制 file.write('haha')
read 从一个打开的文件中读取一个字符串。python的字符串是二进制数据,不仅仅是文字 len=file.read(10)[读取10个长度的内容,空格也计算在内]
tell 告诉文件的当前位置,下次读写会发生在文件开头的字节后 file.tell()
seek 改变当前文件的位置,第一个字母表示要移动的字节数,From表示开始移动字节的参考位置 file.seek(0,0)
readline 以行的形式去读,一行一行的读 data=f.readline()
readlines 把所有的行读出来 data=f.readlines()

一个注意点是句柄用完后一定要关闭,不然在大量文本情况下会大量消耗系统内存

    file.close()

但是使用with open 就会自动关闭这是要注意到的。

将字符文本保存到文件中,可读性是很重要的,以列的形式表示有助于我们阅读,假如我的对象有4个变量,那如何将这四个变量有序的存储在txt文本呢?

name=['wang','zhou','sudong']
num=['1','2','3']
house=['nanjing','shanghai','guangdong']
year=['19','20','21']
with open("D:/a.txt","a+") as f:
for i in range(0,3):
thing='\t'.join((name[i],num[i],house[i],year[i]))
f.write(thing)
f.write('\n')

通过'\t'.join就可以实现有序的保存

CSV文件存储

Python对CSV文件的存储及其简单,以行的形式读取CSV代码如下:

import csv
with open('a.csv',"r",encoding='utf-8') as fileread:
csv_reader=csv.reader(fileread)
for row in csv_reader:
print(row)

csv以行的形式写文件:

import csv
out_put=['2','0','2','1']
with open('1.csv','a+',encoding='UTF-8',newline='') as csvwrite:
w=csv.writer(csvwrite)
w.writerow(out_put)

此外除了使用文件和csv之外我们还可以使用数据库进行保存。

由于是从零基础去学习爬虫的存储,所以数据库的安装是很有必要说一下的

这里我比较喜欢用小皮面板里的数据库,让我们来看看数据库如何安装以及数据库的基本操作。

首先在网址https://www.xp.cn下载小皮面板,打开小皮面板并在phpstudy_pro/Extension找到相应的Mysql目录并且进入,然后打开CMD控制台:

输入

mysql -u root -p
password:root

连接到数据库

连接到数据库后我们需要了解下数据库的基本命令:

#显示数据库
show databases;
#创建数据库
CREATE DATABASE scraping
#使用数据库
USE scraping
#创建数据表
CREATE TABLE urls(
id INT NOT NULL AUTO_INCREMENT,
url VARCHAR(1000) NOT NULL,
content VARCHAR(4000) NOT NULL,
crated_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
);
#查看数据表的结构
DESCRIPBE urls;
#插入数据
INSERT INTO urls (url,content) VALUES ("www.baidu.com","嘿嘿嘿");
#查询数据
SELECT * FROM urls WHERE id=1;
#查询部分数据
SELECT url,content FROM urls WHERE id=1;
#删除某些数据
DELETE FROM urls WHERE url="www.baidu.com"
#更新某些数据
UPDATE urls SET url="www.google.com",content="Google" WHERE id=2;

通过Python操作Mysql数据库需要事先用PIP下载好pymysql

#coding:utf-8
import pymysql
#连接到数据
Dbcursor=pymysql.connect(host="127.0.0.1",user="root",password="root1234",database="scraping")
cursor=Dbcursor.cursor()
sql="""INSERT INTO urls (url,content) VALUES ('www.baidu.com','测试代码1')"""
try:
cursor.execute(sql)
Dbcursor.commit()
except:
Dbcursor.rollback()
Dbcursor.close()

逻辑:通过连接到数据库然后通过cursor()方法获得数据库操作的游标,继而对数据库执行sql语句的操作。

实战:

#coding:utf-8
import requests
import re
import pymysql
from bs4 import BeautifulSoup
link="https://nj.ke.com/ershoufang/pg"
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0","Host":
"nj.ke.com"}
db=pymysql.connect(host="127.0.0.1",user="root",password="root1234",database="house_selling")
cursor=db.cursor()
sql="""CREATE TABLE house(
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(1000) NOT NULL,
`house_info` VARCHAR(1000) NOT NULL,
`total_money` VARCHAR(1000) NOT NULL,
`aver_money` VARCHAR(1000) NOT NULL,
`address` VARCHAR(1000) NOT NULL,
`created_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
);
"""
cursor.execute(sql)
for i in range(1,999):
link_=link+str(i)+'/'
r=requests.get(link_,headers=headers)
soup=BeautifulSoup(r.text,"html.parser")
houst_list=soup.find_all('li',class_='clear')
for house in houst_list:
name=house.find('div',class_='title').a.text.strip()
houst_info=house.find('div',class_='houseInfo').text.strip()
houst_info=re.sub('\s+','',houst_info)
total_money=str(house.find('div',class_='totalPrice').span.text.strip())+'万'
aver_money=str(house.find('div',class_='unitPrice').span.text.strip())
adderess=house.find('div',class_='positionInfo').a.text.strip()
print(name,houst_info,total_money,aver_money,adderess)
sql="""INSERT INTO house (name,house_info,total_money,aver_money,address) values (%s,%s,%s,%s,%s)"""
values=(name,houst_info,total_money,aver_money,adderess)
cursor.execute(sql,values)
#把数据库进行更新,如果缺少,代码就会报错
db.commit()
cursor.close()
db.close()

通过查看数据库发现数据库已经写入,

本文总结:通过本篇文章,我们学到了通过Python进行文件处理,可以将文件写入txt,csv文本,甚至写入到数据库,其中最关键的就是写入到数据库里,通过将爬取到的数据库写入到数据库里,我们可以创造更多有价值的东西,包括可视化之类的。至此爬虫的三部分包括获取、解析、存储已经讲完了。但是后面多线程的爬虫、分布式爬虫的内容才是更有魅力的。

Python爬虫系统化学习(4)的更多相关文章

  1. Python爬虫系统化学习(5)

    Python爬虫系统化学习(5) 多线程爬虫,在之前的网络编程中,我学习过多线程socket进行单服务器对多客户端的连接,通过使用多线程编程,可以大大提升爬虫的效率. Python多线程爬虫主要由三部 ...

  2. Python爬虫系统化学习(2)

    Python爬虫系统学习(2) 动态网页爬取 当网页使用Javascript时候,很多内容不会出现在HTML源代码中,所以爬取静态页面的技术可能无法使用.因此我们需要用动态网页抓取的两种技术:通过浏览 ...

  3. Python爬虫系统化学习(3)

    一般来说当我们爬取网页的整个源代码后,是需要对网页进行解析的. 正常的解析方法有三种 ①:正则匹配解析 ②:BeatuifulSoup解析 ③:lxml解析 正则匹配解析: 在之前的学习中,我们学习过 ...

  4. Python爬虫系统学习(1)

    Python爬虫系统化学习(1) 前言:爬虫的学习对生活中很多事情都很有帮助,比如买房的时候爬取房价,爬取影评之类的,学习爬虫也是在提升对Python的掌握,所以我准备用2-3周的晚上时间,提升自己对 ...

  5. 一个Python爬虫工程师学习养成记

    大数据的时代,网络爬虫已经成为了获取数据的一个重要手段. 但要学习好爬虫并没有那么简单.首先知识点和方向实在是太多了,它关系到了计算机网络.编程基础.前端开发.后端开发.App 开发与逆向.网络安全. ...

  6. python爬虫专栏学习

    知乎的一个讲python的专栏,其中爬虫的几篇文章,偏入门解释,快速看了一遍. 入门 爬虫基本原理:用最简单的代码抓取最基础的网页,展现爬虫的最基本思想,让读者知道爬虫其实是一件非常简单的事情. 爬虫 ...

  7. Python爬虫的学习经历

    在准备学习人工智能之前呢,我看了一下大体的学习纲领.发现排在前面的是PYTHON的基础知识和爬虫相关的知识,再者就是相关的数学算法与金融分析.不过想来也是,如果想进行大量的数据运算与分析,宏大的基础数 ...

  8. python爬虫scrapy学习之篇二

    继上篇<python之urllib2简单解析HTML页面>之后学习使用Python比较有名的爬虫scrapy.网上搜到两篇相应的文档,一篇是较早版本的中文文档Scrapy 0.24 文档, ...

  9. 【Python爬虫案例学习】下载某图片网站的所有图集

    前言 其实很简短就是利用爬虫的第三方库Requests与BeautifulSoup. 其实就几行代码,但希望没有开发基础的人也能一下子看明白,所以大神请绕行. 基本环境配置 python 版本:2.7 ...

随机推荐

  1. Codeforces Round #689 (Div. 2, based on Zed Code Competition) E. Water Level (贪心好题)

    题意:你在一家公司工作\(t\)天,负责给饮水机灌水,饮水机最初有\(k\)升水,水的范围必须要在\([l,r]\)内,同事每天白天都会喝\(x\)升水,你在每天大清早可以给饮水机灌\(y\)升水,问 ...

  2. Java 窗口 绘制图形 #2

    写在前面: 高考结束咧,爽到啊,好耶 完善了Java 窗口 绘制图形 #1里面的程序 加入了缩放平移功能,给代码加了注释 1 package my_package; 2 3 import java.a ...

  3. hdu4778 Gems Fight!

    Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 327680/327680 K (Java/Others) Total Submis ...

  4. Codeforces Round #633 div2 A~C

    A. Filling Diamonds 题意:给你n个菱形方块,问能构成图示形状的有多少种 题解:自己画几个不难发现答案是n 代码: 1 #include <iostream> 2 #in ...

  5. poj 2566 Bound Found 尺取法

    一.首先介绍一下什么叫尺取 过程大致分为四步: 1.初始化左右端点,即先找到一个满足条件的序列. 2.在满足条件的基础上不断扩大右端点. 3.如果第二步无法满足条件则到第四步,否则更新结果. 4.扩大 ...

  6. 用了很多年Dubbo,连Dubbo线程池监控都不知道,觉得自己很厉害?

    前言 micrometer中自带了很多其他框架的指标信息,可以很方便的通过prometheus进行采集和监控,常用的有JVM的信息,Http请求的信息,Tomcat线程的信息等. 对于一些比较活跃的框 ...

  7. OkHttp Client Ignore certificate

    import okhttp3.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.net.ssl.*; i ...

  8. @Indexed 注解

    本文转载自:https://www.cnblogs.com/aflyun/p/11992101.html 最近在看 SpringBoot 核编程思想(核心篇),看到走向注解驱动编程这章,里面有讲解到: ...

  9. Vue3.0新特性

    Vue3.0新特性 Vue3.0的设计目标可以概括为体积更小.速度更快.加强TypeScript支持.加强API设计一致性.提高自身可维护性.开放更多底层功能. 描述 从Vue2到Vue3在一些比较重 ...

  10. 牛年 dotnet云原生技术趋势

    首先祝大家:新年快乐,牛年大吉,牛年发发发! 2020年的春节,新冠疫情使得全球业务停滞不前,那时候,没有人知道会发生什么,因此会议被取消,合同被搁置,项目被推迟,一切似乎都停止了.但是我们却见证了I ...