python安装之后检查发现不存在可能是路径path问题

python不区分""和''但是必须成对出现

◆什么是爬虫

网络爬虫,是一种按照一定规则,自动抓取互联网信息的程序或者脚本。由于互联网

数据的多样性和资源的有限性,根据用户需求定向抓取相关网页并分析已成为如今主流

的爬取策略。

◆爬虫可以做什么

你可以爬取妹子的图片,爬取自己想看的视频等等,只要你能通过浏览器访问的数据

都可以通过爬虫获取。

◆爬虫的本质是什么

模拟浏览器打开网页,获取网页中我们想要的那部分数据。

◆爬虫基本流程

◆准备工作

通过浏览器查看分析目标网页url变换特点

◆获取数据

通过HTTP库向目标站点发起请求,请求可以包含额外的 HTTP, header,等信息,如

果服务器能正常响应,会得到一个 Response,便是所要获取的页面内容。

◆解析内容

得到的内容可能是HTML、json等格式,可以用页面解析库、正则表达式等

进行解析。

◆保存数据

保存形式多样,可以存为文本,也可以保存到数据库,或者保存特定格式的

文件。

爬虫基础知识学习_python

爬虫是前半部分,搜索引擎就是加了索引后面。

爬虫基础知识学习_数据库_02

通过逐级缩小读取查找文字所在位置(要知道是如何找到文字位置)html->body->wrapper->

URL

URL 专业一些的叫法是统一资源定位符(Uniform Resource Locator),它的一般格式如下(带方括号[]的为可选项):

protocol :// hostname[:port] / path / [;parameters][?query]#fragment

URL 的格式主要由前个三部分组成:

  • protocol:第一部分就是协议,例如百度使用的就是https协议;
  • hostname[:port]:第二部分就是主机名(还有端口号为可选参数),一般网站默认的端口号为80,例如百度的主机名就是www.baidu.com,这个就是服务器的地址;
  • path:第三部分就是主机资源的具体地址,如目录和文件名等。

爬虫需要的第三方库

  • bs4就是beautifulsoup4
  • import re
  • urllib 库是 Python 内置的,无需我们额外安装,只要安装了 Python 就可以使用这个库。 import urllib .request,urllib .error
  • import requests 库是第三方库,需要我们自己安装。
  • import xlwt  #进行excel操作
  • import  sqlite3

request库基础语法

1.基础函数

爬虫基础知识学习_html_03

encoding = 'utf-8'

使用utf-8可以正常显示中文、日文、韩文、阿拉伯文

可以直接使用r.encoding=r.apparent_encoding代替r.encoding = 'utf-8'

r是网址内容存储的位置

设置编码格式,encoding是编码的意思,在python中,Unicode类型是作为编码的基础类型。

response = requests.get('http://www.baidu.com')

print(response.status_code)  # 打印状态码

print(response.url)          # 打印请求url

print(response.headers)      # 打印头信息

print(response.cookies)      # 打印cookie信息

print(response.text)  #以文本形式打印网页源码

print(response.content) #以字节流形式打印

2.返回对象

text返回的是Unicode型的数据 ,content返回的是是二进制的数据。 也就是说,如果你想取文本,可以通过r.text。 如果想取图片,文件,则可以通过r.content

爬虫基础知识学习_数据库_04

r.status_code              HTTP请求的返回状态,200表示连接成功,404表示失败

r.text                           HTTP响应内容的字符串形式,即url对应的页面内容

r.encoding                  从HTTP header中猜测的响应内容编码方式

r.apparent_encoding 从内容中分析出的响应内容编码方式(备选编码方式)

r.content                     HTTP响应内容的二进制形式

r.raise_for_status        如果网连接出现错误,那么它就会用try-except来获取一个异常

r.apparent_encoding比r.encoding更为准确

3.错误汇总

python requests SSL证书问题

  • 方法一:加上一个参数:verify=证书路径,或verify=False

            例:url = 'https://inv-veri.chinatax.gov.cn/'

     req = requests.get(url,verify=False)

  • 方法二:直接上一段添加证书代码

   

ssl._create_default_https_context = ssl._create_unverified_context#注意用了这个就不能用requests了,得用urllib2.Request

 

异步爬取

速度更快

html两种读取方法

方法一:

url = "http://www.douyu.com/Jack_Cui.html"
req = request.Request(url)
responese = request.urlopen(req)
html = responese.read().decode()
Print(“html ”)

decode是转换返回数据的bytes格式为str

方法二:

url = "http://www.douyu.com/Jack_Cui.html"
req = requests.get(url=url)
req.encoding = req.apparent_encoding
Print(rep.text)

BeautifulSoup4模块

1.beautifulsoup4主要解析器

爬虫基础知识学习_爬虫_05

用的比较多的是 lxml 解析器

使用例子:

soup = BeautifulSoup(html,"html.parser")

 

print(soup.title.string )              获取标题的内容

print(soup.p.string  )                 获取 p标签里面的内容

print(soup.title.parent.name)    获取 title的父级标签

print(soup.get_text())                获取网页中所有的内容  

print   (soup.a)                               获取所有的a标签中的所有内容(<a> 标签用于指定超链接)

2.beautifulsoup4返回的对象

BeautifulSoup4将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,

所有对象可以归纳为4种:

  • Tag
  • NavigableString
  • BeautifulSoup
  • Comment

Tag:

  1. 利用 soup加标签名轻松地获取这些标签的内容
  2. 它查找的是在所有内容中的第一个符合要求的标签
  3. 这些对象的类型是<class 'bs4.element.Tag'>
  4. Tag对象的两个重要属性:

name :输出标签的标签类型名

attrs :以字典的形式获取标签的属性,也可以修改和删除

NavigableString

  • 作用:获取标签内部的文字
  • 直译:可遍历的字符串
  • 使用方法:soup.p.string
  • 对象类型:<class 'bs4.element.NavigableString'>

BeautifulSoup

  • 文档对象,也就是整个文档的内容。
  • 可以当做是一个Tag对象。

Comment

  • Coment对象是一个特殊类型的NavigableString对象。
  • 如果标签内部的内容是注释,例如:<!-- Elsie -->。那么该NavigableSring对象会转换成Comment对象,并且会把注释符号去掉。
  • 如果我们需要获得Coment类型的对象,需要先判断对象类型是Coment还是NavigableString。

re正则表达式

1.引入模块

import re

2.正则表达式的常用操作符

爬虫基础知识学习_python_06

爬虫基础知识学习_数据_07

例:pattern = "1[35678]\d{9}"

规则:1.都是数字 2.长度为11 3.第一位是1 4.第二位是35678中的一位

3.re库主要功能函数

爬虫基础知识学习_数据库_08

re.compile( ):根据包含的正则表达式的字符串创建模式对象

注:在进行search,match等操作前不适用compile函数,会导致重复使用模式时,需要对模式进行重复的转换。降低匹配速度。而此种方法的调用方式,更为直观。

  • re.match(pattern, str)例子:

result = re.match(pattern, str)   #pattern为要校验的规则,str为要进行校验的字符串,从左到右进行匹配

result.group()                            #如果result不为None,则group方法则对result进行数据提取

  • re.compile(pattern[, flags])例子:

      pattern = re.compile(r'<a href="(.*?)">')  

  • re.search(pattern, str)例子:
  • re.findall(pattern, str)例子:
  • re.split(pattern, str)例子:

4.re返回的对象

RegexObject 对象由re.compile() 返回

Match对象由match(),search(),findall()返回

  • Match对象

xlwt模块

1.设置文本样式

import xlwt

# 使用Workbook创建一个表格

wbk = xlwt.Workbook()

# add_sheet添加工作表

sheet = wbk.add_sheet("sheet")

# 设置样式,初始化样式

style = xlwt.XFStyle()

#设置字体

font = xlwt.Font()

font.name = u"微软雅黑"

font.colour_index = 4

font.bold = True

style.font = font

# 对工作表进行操作 第一个数字代表行 从0开始 第二个数字代表列 从0开始

sheet.write(0,1,'hello',style)

sheet.write(1,1,"python")

# 保存文件,默认为程序同级目录

wbk.save("test.xls")

爬虫基础知识学习_爬虫_09

2.设置表格样式

import xlwt

header = [u"列表1",u"列表2"]

xls = xlwt.Workbook()

sheet = xls.add_sheet("sheet")

# 设置列宽

sheet.col(0).width = (5000)

sheet.col(1).width = (30*500)

# 设置行高

tall_style = xlwt.easyxf('font:height 720;')

sheet.row(0).set_style(tall_style)

i = 0

for each_header in header:

  sheet.write(0,i,each_header)

  i += 1

xls.save("test.xls")

爬虫基础知识学习_python_10

sqlite3模块

对比mysql数据库的使用

1.Python SQLITE数据库导入模块:

import sqlite3

2.创建数据库/打开数据库:

cx = sqlite3.connect("E:/test.db") 其实我们不需要显式的创建一个sqlite数据库,在调用connect函数的时候,指定库名称,如果指定的数据库存在就直接打开这个数据库,如果不存在就新创建一个再打开。这一点应用很好理解。

3.数据库连接对象:

打开数据库时返回的对象cx就是一个数据库连接对象,它可以有以下操作:

commit()--事务提交   rollback()--事务回滚   close()--关闭一个数据库连接   cursor()--创建一个游标

4.Python SQLITE数据库游标的使用:

首先,定义一个游标:

cu = cx.cursor() 这样定义了一个游标。游标对象有以下的操作:

execute()--执行sql语句   executemany--执行多条sql语句   close()--关闭游标   fetchone()--从结果中取一条记录,并将游标指向下一条记录   fetchmany()--从结果中取多条记录   fetchall()--从结果中取出所有记录   scroll()--游标滚动 下面就使用Python SQLITE数据库中游标对我们上面建立的数据库作一些操作吧:

1,建表:
cu.execute('create table catalog (id integer primary key,pid integer,name varchar(10) UNIQUE)') 上面语句创建了一个叫catalog的表,它有一个主键id,一个pid,和一个name,name是不可以重复的。

2,插入数据:
cu.execute("insert into catalog values(0, 0, 'name1')")  cu.execute("insert into catalog values(1, 0, 'hello')") 简单的插入两行数据,不过需要提醒的是,只有提交了之后,才能生效.我们使用数据库连接对象cx来进行提交commit和回滚rollback操作.
cx.commit()

3,查询:
cu.execute("select * from catalog") 要提取查询到的数据,使用游标的fetch***函数,如:
print cu.fetchall() 返回结果如下:
[(0, 0, u'name1'), (1, 0, u'hello')] 如果我们使用cu.fetchone(),则首先返回列表中的第一项,再次使用,则返回第二项,依次下去.

4,修改:
cu.execute("update catalog set name='name2' where id = 0")

cx.commit() 注意,修改数据以后提交

5,删除:
cu.execute("delete from catalog where id = 1")  cx.commit() 以上简单的操作反应的Python SQLITE数据库操作的基本要点,这里点到为止.然后,SQLite的强大,并不仅限于此,其对SQL高级特性的支持及其小巧灵活的特点,使得SQLite在众多领域受到开发者的青睐.

Urllib模块