ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python爬虫基础知识

2022-02-01 13:58:00  阅读:246  来源: 互联网

标签:fp 文件 Python 标签 BeautifulSoup 爬虫 soup import 基础知识


来自《Python爬虫、数据分析与可视化 从入门到精通》

网页结构

<div>定义了一个区块,表示在网页中划定一个区域来显示内容。分别用width与height来定义区块的宽与长,border定义区块边框的格式(粗细、线性、颜色)等,这些参数都存放在Style属性下.

<ur>标签和<ol>标签分别用于定义无序列表和有序列表,
<li>标签位于<ur><ol>标签之下,一个<li>表示列表中的一项,无序列表中默认为小圆点格式,有序的为数字序号

<h>用于定义标题,从<h1><h6>字号由大到小
<a>用于定义链接,href用于指定链接的地址
<p>用于定义段落,不设置样式时,一个<p>标签的内容在网页中显示为一行
<span>可以将网页元素放在一行中显示。
<img>仅用于显示图片,src指定图片的地址,alt属性指定图片无法正常加载时的替换文本

Request模块

Request模块获取数据方式

1.获取静态网页的源代码

静态页面是指设计好后其内容就不再变动的网页,所有用户访问该网页时看到的结果都一样。

import requests
response=requests.get(url='https://www.baidu.com/')
print(response.text)

2.获取动态网页的源代码
动态服务器是指服务器返回一个网页模板,数据通过Ajax或其他方式填充到模板的指定位置,我们想要的数据一般都在服务器返回的JSON格式数据包中。
headers设置请求头信息,在network后name中左边数据包一般为第一个,然后切换header选项卡,找到user-Agent
url也在上述选项中找到,第一行,在?之前的。?之后的以params传入。
params用于发送请求时携带动态参数
timeout设置请求超时间抛出异常
proxies参数,设置代理服务器来代替实际的ip地址来发起请求,避免同一ip过多次访问被识别,这是规避“反爬”手段之一。

proxies={'http':'101,123,102,12:799'}
response.get(url,proxies=proxies)
import requests
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36(KHTML,like Gecko) Chrome/78.0.3984.108 Safari/537.36'}
url='https://movie.douban.com/j/chart/top_list'
params={'type':'25','interval_id':'100:90','action':'','start':'0','limit':1}
response=requests.get(
    url=url, headers=headers,params=params,timeout=2.0)
print(response.json())

2.获取图片

import requests
url = 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.jj20.com%2Fup%2Fallimg%2Ftp05%2F19100120461512E-0-lp.jpg&refer=http%3A%2F%2Fimg.jj20.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1640952949&t=24a7a161a404aeaf47c3a8f7ab44ccca'
response=requests.get(url=url)
content=response.content
with open('图片.jpg','wb') as fp:
    fp.write(content)

备注With open参数选择用法

r: 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 rb:
以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 r+: 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+:以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
w: 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb: 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
w+: 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb+:以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a: 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab: 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+: 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+:以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

豆瓣电影排行榜

import requests
import json
url='https://movie.douban.com/j/chart/top_list?'
params={'type':'25','interval_id':'100:90','action':'','start':'0','limit':'150'}

headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Edg/97.0.1072.62'}

response=requests.get(url=url,params=params,headers=headers)
content=response.json()
print(content)

for i in content:
    print(json.dumps(i,indent=4,ensure_ascii=False,separators=(',',':')))
    #ensure_ascii设置将数据编码后显示文本内容,separators设置键与键之间的分隔符,indent设置缩进量
    break

with open('豆瓣电影动画排行榜.txt','w',encoding='utf-8') as fp:
    for i in content:
        title=i['title']
        score=i['score']
        fp.write(title+' '+score+'\n')

BeuatifulSoup模块

1.实例化BeautifulSoup对象

本地HTML文档

from bs4 import BeautifulSoup
fp=open('test1.html',encoding='utf-8')#读取本地html文档
soup=BeautifulSoup(fp,'lxml')
#用读取的html文档实例化为一个BeautifulSoup对象,并指定解析器为lxml

获取网页源代码

from bs4 import BeautifulSoup
import requests
response=requests.get(url='https://www.baidu.com').text
soup=BeautifulSoup(response,'lxml')

2.用BeautifulSoup对象定位标签

示例tets1html

a.通过标签名定位
网页源代码中可能会有多个同名标签,通过标签名进行定位只能返回其中的第一个标签

from bs4 import BeautifulSoup
fp=open('E:\\Pylearning\\test1.html',encoding='utf-8')#读取本地html文档
soup=BeautifulSoup(fp,'lxml')
print(soup.p)#通过标签名定位第一个<p>标签

b.通过标签属性定位
标签属性有class,id等,实践中主要使用class属性来定位标签。另外,因为class这个单词本身是python的保留字,所以BeautifulSoup模块中的class属性在末尾添加了下划线来进行区分。其他标签属性,则没有添加下划线。

from bs4 import BeautifulSoup
fp=open('E:\\Pylearning\\test1.html',encoding='utf-8')#读取本地html文档
soup=BeautifulSoup(fp,'lxml')
print(soup.find(class_='first'))#返回class属性为first的第一个标签
print(soup.find_all(class_='first'))#返回class属性为first的所有标签的列表

c.通过标签名+属性定位

from bs4 import BeautifulSoup
fp=open('E:\\Pylearning\\test1.html',encoding='utf-8')
soup=BeautifulSoup(fp,'lxml')
print(soup.find('div',class_='first'))
print(soup.find_all('div',class_='first'))

d通过选择器进行定位
使用select()函数可以根据指定的选择器返回所有符合条件的标签,常用的选择器有id选择器、class选择器、标签选择器和层级选择器

id选择器

from bs4 import BeautifulSoup
fp=open('E:\\Pylearning\\test1.html',encoding='utf-8')
soup=BeautifulSoup(fp,'lxml')
print(soup.select('#first'))# "#"代表id选择器,first代表id属性的值

class选择器

from bs4 import BeautifulSoup
fp=open('E:\\Pylearning\\test1.html',encoding='utf-8')
soup=BeautifulSoup(fp,'lxml')
print(soup.select('.first'))# "."代表class选择器,first代表class属性的值
#相当于 print(soup.find_all(class='first'))

标签选择器
与a中只用标签名进行定位的不同之处,在于该方法能返回所有该类的所有标签

from bs4 import BeautifulSoup
fp=open('E:\\Pylearning\\test1.html',encoding='utf-8')
soup=BeautifulSoup(fp,'lxml')
print(soup.select('li'))

层级选择器
一个标签可以包含另一个标签,这些标签位于不同的层级,形成层层嵌套的结构。利用层级选择器可以先定位外层的标签,再定位内层的标签,这样一层层地往里定位,就能找到想要的标签。

from bs4 import BeautifulSoup
fp=open('E:\\Pylearning\\test1.html',encoding='utf-8')
soup=BeautifulSoup(fp,'lxml')
print(soup.select('div>ul>#first'))#选中所有<div标签下<ul>标签中id属性为first的所有标签,'>'代表中间不能有其他层级
print(soup.select('div>ul>li'))#选中所有<div标签下<ul>标签下所有<li>标签
print(soup.select('div li'))#选中<div>标签包含的所有<li>标签 

3.从标签中提取文本内容和属性值

a.从标签中提取文本内容
定位到标签后,还需要从标签中提取文本内容,才能获得需要的数据。从标签中提取文本内容可以利用标签的string属性或text属性。
string属性返回的是指定标签的直系文本,即直接存在于该标签中的文本,而不是存在于该标签下的其他标签中的文本。text属性返回的是指定标签下的所有文本

from bs4 import BeautifulSoup
fp=open('E:\\Pylearning\\test1.html',encoding='utf-8')
soup=BeautifulSoup(fp,'lxml')
print(soup.select('.first')[1].string)
#select('.first')[1]表示使用select函数根据Class选择器定位class属性值为first的所有标签,
#再从返回的标签列表中指定第二个标签用于提取文本内容。
#string属性提取直系文本,如果当前标签没有直系文本,或者由于当前标签包含子标签,导致
print(soup.select('.first')[1].text)
#提取所有文本

从标签中提取属性

from bs4 import BeautifulSoup
fp=open('E:\\Pylearning\\test1.html',encoding='utf-8')
soup=BeautifulSoup(fp,'lxml')
print(soup.find(class_='first')['class'])

XPath表达式

1.实例化etree对象

fom lxml import etree
html=etree.parse('E:\\Pylearning\\test1.html')

from bs4 import BeautifulSoup
import requests
result=requests.get(url='https://www.baidu.com').text
html=etree.HTML(result)

2.用XPath表达式定位标签并提取数据

1.定位标签
标签名定位
/表示一个层级,//表示多个层级

/html/body/div[1]/ul/li

不加区别地定位页面中所有li标签,也可以用//表示li标签节点上的每一级标签节点
索引定位
etree对象的每个层级都是一个包含所有标签节点的列表,如果同个层级中有多个同名的标签节点,使用列表切片就能定位到所需的标签节点
属性定位

import requests
from lxlm import etree
result=requests.get(url='https://www.baidu.com').text
html=etree.HTML(result)
print(html.xpath('//*[@class ="title"]'))#用class属性定位标签

2.提取文本内容和属性值
定位到标签节点后,可在XPath表达式后面添加’/text()‘来提取该节点的直系文本内容,添加’//@属性名’来提取该节点的指定属性值

html.xpath('//*[@class ="title"]/text()')

3.快速获取标签节点的XPath表达式

直接在源代码处选中复制就可以了

标签:fp,文件,Python,标签,BeautifulSoup,爬虫,soup,import,基础知识
来源: https://blog.csdn.net/weixin_44717382/article/details/122512309

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有