预备知识
HTML
www.w3school.com.cn/html/html_j…
- 全称:超文本标记语言
- 标记语言:一套标记标签(markup language)
- 作用:使用标记标签描述网页
HTML标签
- 成对出现
- 是<>括起的关键词
HTML 文档=网页
-
作用:描述网页
-
包含:HTML标签和纯文本
-
浏览器使用标签解释页面内容,不显示HTML标签
-
html参考手册
<html>
<body>
<h1>此处文本被显示为标题</h1>
<p>此处文本被显示为段落</p>
</body> #body之间的文本是可见页面内容
</html> #html之间的文本是描述页面
复制代码
XML
www.w3school.com.cn/xml/xml_int…
HTML 被设计用来显示数据。
XML 被设计用来传输和存储数据。XML 标签没有被预定义,需要自行定义标签。
安装requests和beautifulsoup4过程中出现的问题
1)报错:需要升级pip;
2)升级pip报错:No module named pip
原因:windows的命令权限不足
解决方法:右键命令提示符程序,以管理员身份运行 ,切换到python的安装包目录,不要进入scripts,再执行:python -m pip install --upgrade pip
pip的使用
- 安装:pip install 模块名
- 卸载:pip uninstall 模块名
- pip 安装模块无法运行->easy_install(同pip)
- pip、easy_install都不可行:官网下源码安装或找官网上的一键安装包后缀名msi。有时需安装类似VCforpython的环境文件
使用Pycharm安装Python第三方库
File->settings->project->project Interpreter->点击上面界面右上角的“+”->在搜索框中搜索需要安装的第三方库->点击界面左下角的Install Package进行安装即可
注意:安装的版本要匹配Python版本
简单爬虫
注意
编码格式问题
-
Python3默认utf8,Python默认的编码格式不能识别汉字
-
数据乱码:可能是数据使用gbk2312或gbk编码,而Python3默认utf8,解码方式错误
-
html文本编码格式会声明在响应头和html的head标签的meta标签里。 有时响应头可能没有声明编码
解决方法->使用chardet模块自动识别
爬虫被识别
- requests 模块在生成请求时不带Cookie,User-Agent写为python
解决方法->修改requests请求头部
headers = {
"User-Agent": "",
"Cookie": ""}
response = requests.get(URL, headers=headers)
复制代码
用XPath遍历html文档
- 教程:www.w3school.com.cn/xpath/index…
- 原因:BeautifulSoup模块通过标签的class,id等属性锁定标签的位置,但有的标签压根就没有class和id属性用,XPath允许通过多渠道定位目标,可用XPath来定位标签。
- 优点:BeautifulSoup直接去根据class定位标签,若想改成根据标签名定位标签,需要修改python代码、调用的BeautifulSoup的方法和传进去的参数;使用XPath定位,则只需改变传进去的参数,甚至可以把XPath存进数据库,改动时打开数据库即可。
流程:数据获取->数据处理->数据存储
示例(获取和处理)
import requests
from bs4 import BeautifulSoup
html=requests.get('https://movie.douban.com/top250?start=0')
soup = BeautifulSoup(html.text, 'html.parser')
for item in soup.find_all('div',"info"):
title=item.div.a.span.string #获取标题
yearline=item.find('div','bd').p.contents[2].string #获取年份那一行
yearline=yearline.replace(' ','') #去掉这一行的空格
yearline=yearline.replace('\n','') #去掉这一行的回车换行
year=yearline[0:4] #只取年份前四个字符
print(title,'\t',year)
复制代码
利用for循环自动采集10个页面的数据
import requests
from bs4 import BeautifulSoup
start=0
for n in range(0,10):
html=requests.get('https://movie.douban.com/top250?start='+str(start))
start+=25
soup = BeautifulSoup(html.text, 'html.parser')
for item in soup.find_all('div',"info"):
title=item.div.a.span.string #获取标题
yearline=item.find('div','bd').p.contents[2].string #获取年份那一行
yearline=yearline.replace(' ','') #去掉这一行的空格
yearline=yearline.replace('\n','') #去掉这一行的回车换行
year=yearline[0:4] #只取年份前四个字符
print(title,'\t',year)
复制代码