今天是情人节,一个人在家码字。
想送一幅图给大家!
爱情里,千万别将就,也别误判嗷~
敲黑板,进入正题啦!
你需要了解些什么?
网址:
网址的构成
输入网址后发生了什么
翻页后URL的变化
网页源代码:
如何查看
包含什么信息
拓展
爬虫原理:
如何写爬虫
为什么学习爬虫
网页加载方式:
同步加载:改变网址上的某些参数会导致网页发生变化。
举个例子:当当网——新书热卖榜(http://bang.dangdang.com/books/newhotsales/01.00.00.00.00.00-recent7-0-0-1-1)
异步加载:改变网址上的参数不会使网页发生改变,例如:www.lagou.com/gongsi/(翻页后网址不会发生变化)
依旧举个例子:
查看网页源代码组成:
html:描述网页的内容结构
(补充:在HTML文本中,用尖括号括起来的部分称为标签。如果想在正文里使用尖括号(或者大与号小与号,总之是同一个东西),必须使用字符转义,也就是说转换字符的原有意义。,至于&符号本身,则应该使用&替代)
css:描述网页的排版布局
JavaScript:描述网页的事件处理,即鼠标或键盘在网页元素上的动作后的程序
如何理解网页请求过程:
从浏览器输入网址、回车后,到用户看到网页内容,经过的步骤如下:
(1)dns解析,获取ip地址;
(2)建立TCP连接,3次握手;
(3)建立TCP/IP链接,发送HTTP请求报文;
(4)服务器接收请求并作处理;
(5)服务器发送HTTP响应报文;
(6)断开TCP连接,4次握手。
如何查看网页请求:
展示效果:
#信息请求:
Request Headers(请求头)信息详解:
Accept: text/html,image/*(浏览器可以接收的类型)
Accept-Charset: ISO-8859-1(浏览器可以接收的编码类型)
Accept-Encoding: gzip,compress(浏览器可以接收压缩编码类型)
Accept-Language: en-us,zh-cn(浏览器可以接收的语言和国家类型)
Host: www.it315.org:80(浏览器请求的主机和端口)
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT(某个页面缓存时间)
Referer: http://www.it315.org/index.jsp(请求来自于哪个页面)
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)(浏览器相关信息)
Cookie:(浏览器暂存服务器发送的信息)
Connection: close(1.0)/Keep-Alive(1.1)(HTTP请求的版本的特点)
Date: Tue, 11 Jul 2000 18:23:51 GMT(请求网站的时间)
Response Headers(响应头)信息详解:
Location: http://www.it315.org/index.jsp(控制浏览器显示哪个页面)
Server:apache tomcat(服务器的类型)
Content-Encoding: gzip(服务器发送的压缩编码方式)
Content-Length: 80(服务器发送显示的字节码长度)
Content-Language: zh-cn(服务器发送内容的语言和国家名)
Content-Type: image/jpeg; charset=UTF-8(服务器发送内容的类型和编码类型)
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT(服务器最后一次修改的时间)
Refresh: 1;url=http://www.it315.org(控制浏览器1秒钟后转发URL所指向的页面)
Content-Disposition: attachment; filename=aaa.jpg(服务器控制浏览器发下载方式打开文件)
Transfer-Encoding: chunked(服务器分块传递数据到客户端)
Set-Cookie:SS=Q0=5Lb_nQ; path=/search(服务器发送Cookie相关的信息)
Expires: -1(服务器控制浏览器不要缓存网页,默认是缓存)
Cache-Control: no-cache(服务器控制浏览器不要缓存网页)
Pragma: no-cache(服务器控制浏览器不要缓存网页)
Connection: close/Keep-Alive(HTTP请求的版本的特点)
Date: Tue, 11 Jul 2000 18:23:51 GMT(响应网站的时间)
爬虫的用途呢?
市场分析:电商分析 商圈分析 一二级市场分析
市场监控:电商监控 新闻监控 房源监控
商机分析:招投标情况 客户资料 企业客户发掘
通用的网络爬虫结构:
如何编写爬虫steps:
·获得源码:urllib、requests
·解析源码:Beautiful Soup、正则表达式
·保存数据:Xls、MySQL、MongoDB
【编译器:jupyter notebook】
获得源码:urllib、requests
#demo:
使用urllib获取网页信息:
urllib官方文档(部分内容摘要):
网址:https://docs.python.org/3/library/urllib.html#module-urllib
(官方文档英文版看着真难受)
urllib is a package that collects several modules for working with URLs:
调用:
Parse a URL into six components, returning a6-tuple.
示例:
2. 使用requests获取网页信息:
requests官方文档(部分内容摘要):
网址:http://docs.python-requests.org/zh_CN/latest/user/quickstart.html
实例:【抓取豆瓣短评】
BeautifulSoup相关知识:
BeautifulSoup不仅仅只是可以查找,定位和修改文档内容,同样也可以用一个好的 格式进行输出显示。BeautifulSoup可以处理不同类型的输出:
格式化的输出 `. prettify( )`方法
非格式化的输出
出现的问题:
获取结果为网页样式,非纯文本。
解决方法:BeautifulSoup中的". get_text() "方法和 ". string"方法
区别: `get_text`把所有的文本节点都拼接起来返回
`.strings`单独获取每个文本节点,该标签应该是只有单个节点的。比如上面的 1 标签那样。
get_text()
markup = '\nI linked to example.com\n'
soup = BeautifulSoup(markup)
soup.get_text()
>>> u'\nI linked to example.com\n'
soup.i.get_text()
>>> u'example.com'
#通过参数指定tag的文本内容的分隔符:
soup.get_text("")
>>> u'\nI linked to example.com\n'
#去除获得文本内容的前后空白:
soup.get_text("", strip=True)
>>> u'I linked toexample.com'
#使用 .stripped_strings 生成器,获得文本列表后手动处理列表
#[text for text in soup.stripped_strings]
>>> [u'I linked to', u'example.com']
`.string` 方法:
import requests#导入包
import time
http_content = requests.get("https://book.douban.com/subject/1084336/comments/").text#获取地址
time.sleep(10)
from bs4 import BeautifulSoup
soup = BeautifulSoup(http_content,"lxml")
#print(soup)
print(soup.find("h3").string)
time.sleep(10)
from bs4 import BeautifulSoup
soup = BeautifulSoup(http_content,"lxml")
print(soup)
print(soup.find("a").string)
>>> 登陆
错误提示(划重点):treat a list of items like a single item
所以我用for循环遍历了列表(好蠢_)
然鹅,我其实尝试了两种方式(并不知道脑子为什么抽了,情人节打发时间好了)
皮一下就很开心系列
先定位class_=“comment-item”
然后定位进一步class_=“class-content”
接着我就开始纠结soup.find_all(class_=” ”)和soup.find(class_=” ”)(敲黑板,这是重点!)
不多说,直接上图!注意看区别(提示详看find_all 和find 以及 for循环)
四种Beautiful Soup对象类型:Tag,NavigableString,BeautifulSoup和Comment
Tag
对象:html文件中的标签以及标签之间的内容
The Dormouse's story
print (soup.title)
>>> The Dormouse's story
Tag方法
.name #该Tag的标签本身名称。
.attrs #标签中所有属性的字典。
print (soup.p.attrs)
>>> {'class': ['title'], 'name': 'dromouse'}
NavigableString
标签内部的内容由.string方法可以得到,且这些内容为'bs4.element.NavigableString'类型的对象。
print (soup.p.string)
>>> The Dormouse's story
print type(soup.p.string)
>>>
BeautifulSoup
BeautifulSoup 对象表示的是一个文档的全部内容.
Comment
markup = ""#标签中内容为注释
soup = BeautifulSoup(markup)
comment = soup.b.string
type(comment)
>>>
comment
#利用 .string 输出,去掉了注释符号
>>> u'Hey, buddy. Want to buy a used parser'
Beautiful Soup中内置了一些查找方式:
find()
find_all()#返回结果为列表
find_parent()
find_parents()#查找父标签
find_next_sibling()
find_next_siblings()#查找同胞
find_previous_sibling()
find_previous_siblings()
find_previous()
find_all_previous()
find_next()
find_all_next()
find()用来查找第一个匹配结果出现的地方,而find_all()正如名字所示,将会找到所有匹配结果出现的地方。
find()函数如下:
find(name,attrs,recursive,text,**wargs)
这些参数相当于过滤器一样可以进行筛选处理。
不同的参数过滤可以应用到以下情况:
查找标签,基于name参数
查找文本,基于text参数
基于正则表达式的查找
查找标签的属性,基于attrs参数
基于函数的查找
最后贴一下官方代码:
参考文献:
https://www.cnblogs.com/wuwenyan/p/4773427.html
属于自己的皮球
领取专属 10元无门槛券
私享最新 技术干货