Python爬虫系统化学习(4)
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)的更多相关文章
- Python爬虫系统化学习(5)
Python爬虫系统化学习(5) 多线程爬虫,在之前的网络编程中,我学习过多线程socket进行单服务器对多客户端的连接,通过使用多线程编程,可以大大提升爬虫的效率. Python多线程爬虫主要由三部 ...
- Python爬虫系统化学习(2)
Python爬虫系统学习(2) 动态网页爬取 当网页使用Javascript时候,很多内容不会出现在HTML源代码中,所以爬取静态页面的技术可能无法使用.因此我们需要用动态网页抓取的两种技术:通过浏览 ...
- Python爬虫系统化学习(3)
一般来说当我们爬取网页的整个源代码后,是需要对网页进行解析的. 正常的解析方法有三种 ①:正则匹配解析 ②:BeatuifulSoup解析 ③:lxml解析 正则匹配解析: 在之前的学习中,我们学习过 ...
- Python爬虫系统学习(1)
Python爬虫系统化学习(1) 前言:爬虫的学习对生活中很多事情都很有帮助,比如买房的时候爬取房价,爬取影评之类的,学习爬虫也是在提升对Python的掌握,所以我准备用2-3周的晚上时间,提升自己对 ...
- 一个Python爬虫工程师学习养成记
大数据的时代,网络爬虫已经成为了获取数据的一个重要手段. 但要学习好爬虫并没有那么简单.首先知识点和方向实在是太多了,它关系到了计算机网络.编程基础.前端开发.后端开发.App 开发与逆向.网络安全. ...
- python爬虫专栏学习
知乎的一个讲python的专栏,其中爬虫的几篇文章,偏入门解释,快速看了一遍. 入门 爬虫基本原理:用最简单的代码抓取最基础的网页,展现爬虫的最基本思想,让读者知道爬虫其实是一件非常简单的事情. 爬虫 ...
- Python爬虫的学习经历
在准备学习人工智能之前呢,我看了一下大体的学习纲领.发现排在前面的是PYTHON的基础知识和爬虫相关的知识,再者就是相关的数学算法与金融分析.不过想来也是,如果想进行大量的数据运算与分析,宏大的基础数 ...
- python爬虫scrapy学习之篇二
继上篇<python之urllib2简单解析HTML页面>之后学习使用Python比较有名的爬虫scrapy.网上搜到两篇相应的文档,一篇是较早版本的中文文档Scrapy 0.24 文档, ...
- 【Python爬虫案例学习】下载某图片网站的所有图集
前言 其实很简短就是利用爬虫的第三方库Requests与BeautifulSoup. 其实就几行代码,但希望没有开发基础的人也能一下子看明白,所以大神请绕行. 基本环境配置 python 版本:2.7 ...
随机推荐
- 2019牛客暑期多校训练营(第八场)A.All-one Matrices(dp)
题意:又是最大01矩阵的模型了 这次要找的是极大0/1矩阵的个数 思路:我们像处理最大01矩阵那样处理一下边界 由于我们上左右已经无法再继续扩展 我们只需要用前缀和记录一下是否可以向下扩展(即判断当前 ...
- Codeforces Round #647 (Div. 2) A. Johnny and Ancient Computer
题目链接:https://codeforces.com/contest/1362/problem/A 题意 有一个正整数 $a$,可选择的操作如下: $a \times 2$ $a \times 4$ ...
- hdu 01 Matrix
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission ...
- Codeforces Round #501 (Div. 3) D. Walking Between Houses (思维,构造)
题意:一共有\(n\)个房子,你需要访问\(k\)次,每次访问的距离是\(|x-y|\),每次都不能停留,问是否能使访问的总距离为\(s\),若能,输出\(YES\)和每次访问的房屋,反正输出\(NO ...
- 【cpp上】课后正误小题
State whether each of the following is true or false. If false, explain why. Assume the state ment u ...
- java中的装箱及拆箱
java中存在8中基本的数据类型,每一种数据类型都有包装类型. 包装类型:每一个基本的数据类型都会------对应一个包装类型. boolean------------------>Boolea ...
- Leetcode(28)-实现strStr()
实现 strStr() 函数. 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始).如果不存在,则返 ...
- Excel 如何固定表头
Excel 如何固定表头 视图-冻结窗格-冻结首行 EXCEL如何设置固定表头 一.首先打开Excel表格,如果你的表头只有一行,那么直接选择"视图-冻结窗格-冻结首行"就可以了. ...
- PyCharm 中文 字符 python 报错 的 完美 解决方案!
PyCharm 中文 字符 python 报错 的 完美 解决方案! #_*_ coding:utf-8_*_ https://www.python.org/dev/peps/pep-0263/ 到p ...
- JavaScript & Atomics
JavaScript & Atomics Atomics 对象提供了一组静态方法对 SharedArrayBuffer 和 ArrayBuffer 对象进行原子操作. Atomics.add ...