写在前面:
笔者在寒假期间进行了一些简短的实训,主要内容包括简单的爬虫和简单的人脸识别算法,由于时间有限,对于python也是第一次详细学习,功能较为简单,提供给入学者参考,帮助大家进入py的世界,若有不正确或不明确的地方欢迎指正。
以下是一个简单爬虫项目所需要的基本内容,整体的项目代码参考另一片文章:
Python与爬虫入门实践——简易搜狐新闻爬虫02https://blog.csdn.net/gcn_Raymond/article/details/86756404
爬虫是什么?
从互联网中抓取数据的程序
先准备一些网站---找到更多网站---搜集每个页面的数据---保存到服务器中(数据库)
爬虫本质是模拟浏览器访问网页的过程
HTTP/HTTPS
从网站服务器上获取页面,网页传输的是源代码/文件
节点上的数据
img、href标签
Id、class
控制样式
事件驱动
ajax网页异步技术,网站的接口化又称前后端分离(页面相关的东西单独处理,数据由单独的接口提供Web API 数据格式:JSON格式/XML格式)
获取源代码
网页中提取数据
HTTP状态码
状态码有助于我们判断编写的程序是否可以正常连接上指定网站
参考资料:
http://tools.jb51.net/table/http_status_code
urllib库提供了访问HTTP协议的工具
#urllib库提供了访问HTTP协议的工具
import urllib.request
from urllib import request
#获取一个站点的html源码
response=request.urlopen("https://www.qq.com/")
print(response.geturl())
print(response.info())
print(response.getcode())#得到状态码
结果如下:
有时候请求头会被网站识别,他会拒绝我们访问,这是网站的反爬机制,我们只要伪装一下,装作我们是普通用户就可以通过检测了
from urllib import request
from urllib.request import Request
#beautifulsoup
url='http://httpbin.org/get'
#伪装请求头
headers={'User-Agent':' Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}
req=Request(url, headers=headers)
response=request.urlopen(req)
print(response.read().decode('utf-8'))
beautifulsoup可以帮助我们提取网页中html标签,来进一步提取我们想要的元素
pip install beautifulsoup4
安装完成后可以看到新的包出现
查询标题
from urllib import request
from urllib.request import Request
from bs4 import BeautifulSoup
url='http://www.sohu.com/a/289547597_114731?g=0?code=61f919a88328210f408c3e188c241d16'
headers={'User-Agent':' Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}
req=Request(url, headers=headers)
response=request.urlopen(req)
soup = BeautifulSoup(response.read(),'html.parser')
print(soup.h1)#元素选择器
#信息的获取
print(soup.h1.name)#标签名
print(soup.title.string)#标签内的字符串
h1=soup.h1
#去掉空格、换行
print(h1.contents[0])#
newstitle = h1.contents[0]
newstitle=newstitle.replace(' ','')
newstitle=newstitle.replace('\n','')
print(newstitle)
查询内容
article=soup.article
ps=article.contents
#遍历子节点,筛选文字信息
for p in ps:
if p.string:
print(p.string)
这是对于一个新闻内容页的爬取:http://www.sohu.com/a/289547597_114731?g=0?code=61f919a88328210f408c3e188c241d16
这里用到的是sqlite数据库
1.保存到文件中
文本csv json 保存方便,查询不便
2.保存到服务器
可以保存海量数据
3.保存到数据库中
查询方便,速度快
基于文件
创建emp
emp
id 自增主键
name 文本
sex 文本
#创建数据库
import sqlite3
#数据库的连接,参数:数据库文件的名字,如果文件不存在,自动创建文件
conn=sqlite3.connect('mydb.db')
#创建数据表 执行一段sql
#创建执行对象
cor=conn.cursor()
#调用执行对象
cor.execute('''
create table emp(
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
sex TEXT NOT NULL
)
''')
#提交
conn.commit()
#关闭数据库连接
conn.close()
有绿色箭头的DB按钮是同步刷新,有时出现数据库结果和实际结果不一致的时候可以刷新一下试试
有关数据库的详细代码如下:
#创建数据库
import sqlite3
#数据库的连接,参数:数据库文件的名字,如果文件不存在,自动创建文件
def creat_table():
conn=sqlite3.connect('mydb.db')
#创建数据表 执行一段sql
#创建执行对象
cor=conn.cursor()
#调用执行对象
cor.execute('''
create table emp(
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
sex TEXT NOT NULL
)
''')
#提交
conn.commit()
#关闭数据库连接
conn.close()
#增删改查
def add():
conn = sqlite3.connect('mydb.db')
cor = conn.cursor()
cor.execute('''
insert into emp
(name, sex)
values
('赵四','男')
''')
conn.commit()
conn.close()
# if __name__=='__main__':
# add()
def query():
conn = sqlite3.connect('mydb.db')
cor = conn.cursor()
result=cor.execute('''
select * from emp
''')
ls=[]
for row in result:
# print(row[0])
# print(row[1])
# print(row[2])
ls.append(row)
#print(result)
conn.commit()
return ls
conn.close()
if __name__=='__main__':
ls = query()
for row in ls:
print(row)
#删除语句delete from emp where id=1
#修改语句update emp set name='xiaoma',sex='女'