Python-豆瓣短评练习

今天是情人节,一个人在家码字。

想送一幅图给大家!

爱情里,千万别将就,也别误判嗷~

敲黑板,进入正题啦!

你需要了解些什么?

网址:

网址的构成

输入网址后发生了什么

翻页后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

属于自己的皮球

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180214G10OSW00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券