爬虫基础以及BeatifulSoup模块使用

  1. 爬虫的定义:向网站发起请求,获取资源后分析并提取有用数据的程序

爬虫的流程

  • 发送请求 ---> request
  • 获取响应内容 ---> response
  • 解析内容 ---> BeatifulSoup
  • 保存数据 ---> mysql
  1. #1、发起请求
  2. 使用http库向目标站点发起请求,即发送一个Request
  3. Request包含:请求头、请求体等
  4. #2、获取响应内容
  5. 如果服务器能正常响应,则会得到一个Response
  6. Response包含:htmljson,图片,视频等
  7. #3、解析内容
  8. 解析html数据:正则表达式,第三方解析库如Beautifulsouppyquery
  9. 解析json数据:json模块
  10. 解析二进制数据:以b的方式写入文件
  11. #4、保存数据
  12. 数据库
  13. 文件

1.Request请求内容

1.1请求方式:

  1. 常用的请求方式:GETPOST
  2. 其他请求方式:HEADPUTDELETEOPTHONS
  3. ps:用浏览器演示getpost的区别,(用登录演示post
  4. postget请求最终都会拼接成这种形式:k1=xxx&k2=yyy&k3=zzz
  5. post请求的参数放在请求体内:
  6. 可用浏览器查看,存放于form data
  7. get请求的参数直接放在url

1.2请求url

  1. url全称统一资源定位符,如一个网页文档,一张图片
  2. 一个视频等都可以用url唯一来确定
  3. url编码
  4. https://www.baidu.com/s?wd=图片
  5. 图片会被编码(看示例代码)
  6. 网页的加载过程是:
  7. 加载一个网页,通常都是先加载document文档,
  8. 在解析document文档的时候,遇到链接,则针对超链接发起下载图片的请求

1.3请求头

  1. User-agent:告诉它这是浏览器发过来的请求(请求头中如果没有user-agent客户端配置,服务端可能将你当做一个非法用户)务必加上
  2. host
  3. cookiescookie用来保存登录信息
  4. Referer:上一次的跳转路径

1.4请求体

  1. 如果是get方式,请求体没有内容
  2. 如果是post方式,请求体是format data
  3. 1、登录窗口,文件上传等,信息都会被附加到请求体内
  4. 2、登录,输入错误的用户名密码,然后提交,就可以看到post,正确登录后页面通常会跳转,无法捕捉到post

2.响应Response内容

2.1响应状态

  1. 200:代表成功
  2. 301:代表跳转
  3. 404:文件不存在
  4. 403:权限
  5. 502:服务器错误

2.2Respone header

  1. Location:跳转
  2. set-cookie:可能有多个,是来告诉浏览器,把cookie保存下来

2.3preview就是网页源代码.

  1. 最主要的部分,包含了请求资源的内容
  2. 如网页html,图片
  3. 二进制数据等

BeatifulSoup模块和requests模块

  1. requests可以模拟浏览器的请求,BeatifulSoup是一个可以从HTMLXML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式;

安装 BeautifulSoup

1.安装beautifulsoup4

  1. pip install beautifulsoup4

2.安装解析器

  • lxml HTML 解析器:速度快,容错能力强 *****

    1. Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,其中一个是 lxml
  1. pip install lxml
  • html5lib 依照浏览器方式解析文档

    1. 另一个可供选择的解析器是纯Python实现的 html5lib , html5lib的解析方式与浏览器相同,可以选择下列方法来安装html5lib:
  1. pip install html5lib

使用

1.引用BeautifulSoup模块

  1. from bs4 import BeautifulSoup

常用参数

requests模块:

  • requests.get 请求内容
  • response.encoding 解码方式
  • response.text 页面内容

BeautifulSoup4模块:

  • BeautifulSoup(response.text, "lxml") #处理容错格式: BeautifulSoup(页面内容, "lxml")

固定格式部分--获取页面内容

  1. import requests
  2. from bs4 import BeautifulSoup
  3. # 请求内容
  4. response = requests.get(
  5. # 指定 url 地址
  6. url='https://www.autohome.com.cn/news/',
  7. # URL 头部信息
  8. headers={
  9. # 伪装头部信息
  10. "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",
  11. # 伪装从哪个页面来源
  12. "Referer": "https://www.autohome.com.cn/",
  13. # 主机地址
  14. "Host": "www.autohome.com.cn",
  15. }
  16. )
  17. # 解码方式
  18. response.encoding = 'utf-8'
  19. # 将HTML文本转换为一个对象
  20. soup = BeautifulSoup(response.text, "lxml")
  21. # 处理好缩进,结构化显示(易于查看)
  22. # res = soup.prettify()

1.获取标签

1.获取标签(p标签,a标签)

  1. print(soup.p) # 存在多个相同的标签则只返回第一个
  2. print(soup.a) # 存在多个相同的标签则只返回第一个

2.获取标签的名称(p)

  1. print(soup.p.name)

3.获取标签的属性

  1. print(soup.div.attrs)

输出:

  1. {'id': 'auto-header', 'class': ['topbar']}

4.获取标签的内容

  1. print(soup.span.string) # span下的文本只有一个时,取到,否则为None
  2. print(soup.span.strings) # 拿到一个生成器对象, 取到span下所有的文本内容
  3. print(soup.span.text) # 取到span下所有的文本内容

5.嵌套选择(取出 body 下的 a标签 第一个;)

  1. print(soup.head.title.text)
  2. print(soup.body.a.string)

6.子节点、子孙节点

  1. print(soup.p.contents) # p下所有子节点
  2. print(soup.p.children) # 得到一个迭代器,包含p下所有子节点
  3. - 循环该节点,得到索引和值
  4. for i,child in enumerate(soup.p.children):
  5. print(i,child)

7.父节点

  1. print(soup.a.parent) #获取a标签的父节点

8.兄弟节点

  1. print(soup.a.next_sibling) # 下一个兄弟
  2. print(soup.a.previous_sibling) # 上一个兄弟
  3. print(soup.a.next_siblings) # 下面所有兄弟们=>生成器对象
  4. print(soup.a.previous_siblings) # 上面所有兄弟们=>生成器对象

2.过滤器

  1. 将拿到的数据按照一定规则进行过滤,提取有用的信息;

2.1使用BeautifulSoup的find和find_all

  • 查询find_all 列表时,需要指定标签后,才可继续使用find方法

2.2按照类class 进行查找

class的两种用法

  1. # attrs={"class": "sister"}
  2. # class_="sister"
  3. # 两种查出class 类的方法
  4. print(soup.find_all(name="div", attrs={"class": "sister"}))
  5. print(soup.find_all(name="div", class_="sister")) # 这两个是一样的
  6. # 两种查出 id 的方法
  7. print(soup.find_all(attrs={"id":"link3"})) # 这两个是一样的,只是表示方式不一样
  8. print(soup.find_all(id="link3"))

1.找到文档中所有 ul标签 class 为 article 的标签

  1. print(soup.find_all(name="ul", attrs={"class": "article"})) # 找到标签名是ul,属性名是article,

  2. print(soup.find_all('ul', class_='article'))

2.找到文档中div标签,属性为advlist fn-clear标签,顺序错误也匹配不成功

  1. print(soup.find_all(name="div", class_="advlist fn-clear"))

3.查找依照advl 开头的类

  1. print(soup.find_all(name="div", class_=re.compile("^advl")))

2.3使用正则 re 模块进行匹配

1.找到b开头的的标签

  1. import re
  2. print(soup.find_all(name=re.compile("^b")))

2.找到id包含link的标签

  1. print(soup.find_all(attrs={"id":re.compile("link")}))

3.找带有$价钱的文本

  1. print(soup.find_all(text=re.compile(r"\$"))) # 找带有$价钱的文本

4.找到文本中包含 Money字符串 或 $符 的字符串

  1. print(soup.find_all(text=["Money", re.compile(r"\$")])) # 找text 中有Money或 $符 的文本

5.获取 digg-logo 字符串

  1. a = '<a class="digg-logo" href="/"></a>'
  2. digg = re.findall('class="(.*)" href=', str(a))[0]
  3. print(digg)

输出:

  1. digg-logo

2.4列表中任一元素匹配的内容返回

1.找a标签或者b开头的所有的标签

  1. print(soup.find_all(name=["a", re.compile("^b")]))

2.5True:可以匹配任何值

1.找到所有标签的标签名属性的标签(所有)

  1. print(soup.find_all(name=True)) # 找到所有标签的标签名(所有)

2.找到只要有id属性的标签

  1. print(soup.find_all(attrs={"id":True})) # 找到只要有id属性的

3.找到p标签,并且具有id 属性的

  1. print(soup.find_all(name="p",attrs={"id":True}))

2.6自定义过滤器;

1.只接受一个元素参数 ,如果这个方法返回 True 表示当前元素匹配并且被找到,如果不是则反回 False

  1. def has_class_not_id(tag):
  2. # return tag.has_attr('class') and not tag.has_attr('id') # 找到包含class 标签,但是不包含id属性的标签(子标签中含id属性,会被忽略)
  3. # return tag.has_attr('id') and not tag.has_attr('class') # 只包含 id 不包含 class 属性
  4. return tag.name == "a" and tag.has_attr("class") and not tag.has_attr("id") # a 标签,包含class 属性,不包含id属性
  5. print(soup.find_all(has_class_not_id))

2.指定标签,是否深入查询recursive=False or True

  • recursive = True # 从子子孙孙所有内部找到
  • recursive = False # 如果只想搜索当前tag的直接子节点(就不往里面找了),可以使用参数 recursive=False
  1. print(soup.body.div.find_all(attrs={"class": "minitop"}, recursive=False)) # 只查询body标签里子节点包含 "class" = "sister" 的标签

3.CSS选择器:select

1.class为 ad-top-1111 下的 div 标签

  1. print(soup.select('.ad-top-1111 div'))

2.查找id等于 auto-header-channel19 的标签

  1. print(soup.select('#auto-header-channel19'))

3.获取class为 ad-top-1111 下的 div 标签 获取它的属性

  1. print(soup.select('.ad-top-1111 div')[0].attrs)

4.获取class为 ad-top-1111 下的 div 标签,下的内容

  1. print(soup.select('.ad-top-1111 div')[0].get_text)

获取a标签内部属性:

1.获取img标签中的url

  1. img_url = "https:" + img.get("src")

2.获取a标签中的url

  1. a_url = img_url = "https:" + a.get('href')

爬虫基础以及 re,BeatifulSoup,requests模块使用的更多相关文章

  1. python爬虫:爬虫的简单介绍及requests模块的简单使用

    python爬虫:爬虫的简单介绍及requests模块的简单使用 一点点的建议: (学习爬虫前建议先去了解一下前端的知识,不要求很熟悉,差不多入门即可学习爬虫,如果有不了解的,我也会补充个一些小知识. ...

  2. 爬虫(1):requests模块

    requests介绍: reqeusts模块:python原生一个基于网络请求的模块,模拟浏览器发起请求. requests模块的优点: - 1.自动处理url编码 - 2.自动处理post请求的参数 ...

  3. 洗礼灵魂,修炼python(61)--爬虫篇—【转载】requests模块

    requests 1.简介 Requests 是用Python语言编写的第三方库,所以你需要pip安装,安装过程就略过了.它基于urllib,采用 Apache2 Licensed 开源协议的 HTT ...

  4. 爬虫第三篇:requests模块

    requests模块其实就是对urllib.request模块的进步一不优化,提供了很多可选的参数,同时简化了操作.下面我还是贴上具体操作的代码. requests GET请求 GET请求html文件 ...

  5. 爬虫学习(二)requests模块的使用

    一.requests的概述 requests模块是用于发送网络请求,返回响应数据.底层实现是urllib,而且简单易用,在python2.python3中通用,能够自动帮助我们解压(gzip压缩的等) ...

  6. 潭州课堂25班:Ph201805201 爬虫基础 第四课 Requests (课堂笔记)

    优雅到骨子里的Requests   1528811134432   简介   上一篇文章介绍了Python的网络请求库urllib和urllib3的使用方法,那么,作为同样是网络请求库的Request ...

  7. Python爬虫基础(四)Requests库的使用

    requests文档 首先需要安装:pip install requests get请求 最基本的get: # -*- coding: utf-8 -*-import requests respons ...

  8. 爬虫基础之requests模块

    1. 爬虫简介 1.1 概述 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本. 1.2 爬虫的价值 在互 ...

  9. 爬虫之requests模块基础

    一.request模块介绍 1. 什么是request模块 - python中原生的基于网络请求的模块,模拟浏览器发起请求. 2. 为什么使用request模块 - urllib需要手动处理url编码 ...

随机推荐

  1. android xml组建圆角背景设置

    1.实现左边圆角,右边直行的方法: <?xml version="1.0" encoding="utf-8"?> <shape xmlns:a ...

  2. 使用ENCKEYS方法加密数据

    要使用这种数据加密方法,您需要配置Oracle GoldenGate以生成加密密钥并将密钥存储在本地ENCKEYS文件中.此方法使用的永久密钥只能通过根据使用加密密钥填充ENCKEYS文件中的说明重新 ...

  3. CF1100E Andrew and Taxi

    题目地址:CF1100E Andrew and Taxi 二分,每次取到一个 \(mid\) ,只保留长度 \(>mid\) 的边 dfs判环,若有环,说明 \(ans>mid\) ,否则 ...

  4. 反卷积(deconvolution)

    deconvolution讲解论文链接:https://arxiv.org/abs/1609.07009 关于conv和deconvoluton的另一个讲解链接:http://deeplearning ...

  5. Winform调用百度地图接口简单示例

    1.首先用一个html文件调用百度地图接口(主要注册一个序列号):   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitiona ...

  6. logging模块--日志文件

    初级的使用配置模式类似与print 默认打印waring等级及以上--通过更改等级来测试代码 logging.debug("debug no china") #调试模式 loggi ...

  7. 题解-ZeroJudge-c686 高斯符號

    Problem ZeroJudge Solution 考慮到\(\lfloor \frac {km}n\rfloor\)等同於\(km\)整除\(n\),換種表示方法就是\(km\)減去\(km\)模 ...

  8. $Django orm增删改字段、建表 ,单表增删改查,Django请求生命周期

    1 orm介绍  ORM是什么   ORM 是 python编程语言后端web框架 Django的核心思想,“Object Relational Mapping”,即对象-关系映射,简称ORM.  一 ...

  9. minicom的配置和使用

    安装配置minicom--------------------------------------------------# lsmod | grep usbserial (如果直接使用串口线,而没有 ...

  10. MySQL查询语句练习题,测试基本够用了

    Sutdent表的定义 字段名 字段描述 数据类型 主键 外键 非空 唯一 自增 Id 学号 INT(10) 是 否 是 是 是 Name 姓名 VARCHAR(20) 否 否 是 否 否 Sex 性 ...