网络爬虫的尺寸
小规模,数据量小,爬取速度不敏感,requests库(爬取网页,玩转网页,占比>90%)
中规模,数据规模较大,爬取速度敏感,scrapy库(爬取网站,爬取系列网站)
大规模,搜索引擎,爬取速度关键,定制开发(爬取全网)
爬虫引发的问题
骚扰问题 法律问题 隐私泄露
网络爬虫的限制
来源审查:判断user-agent进行限制
Robots协议 网络爬虫排除协议
规定什么可以被爬取什么不能被爬取
Robots协议的使用
自动或人工识别robots.txt,再进行内容爬取
robots基本语法
#注释,代表所有,/代表根目录
User-agent:
Disallow:/
如果访问识别,可以尝试修改访问身份
#爬去网络信息通用代码框架
import requests
def getHTMLText(url):
try:
r=requests.get(url,headers=kv)#修改身份
r.raise_for_status()#如果状态不是200,发出异常
r.encoding=r.apparent_encoding
return r.text[1000:2000]
except Exception as error:
print("%s" %error)
if __name__ == '__main__':
url="http://www.baidu.com"
kv={'user-agent':'Mozilla/5.0'}#定义身份
print(getHTMLText(url))
爬取图片
#爬取网络信息通用代码框架
import requests
import os
def getHTMLText(url):
try:
if not os.path.exists(path):
r = requests.get(url)
with open(path,"wb") as f:
f.write(r.content)
f.close()
print("文件保存成功")
else:
print("文件已存在")
except:
print("爬取失败")
if __name__ == '__main__':
path="E:/abc.jpg"
url="http://pic19.nipic.com/20120308/4970979_102637717125_2.jpg"
HTML遍历方法
子集contents
父集parents
兄弟集sibling
from bs4 import BeautifulSoup
import requests
url="http://python123.io/ws/demo.html"
r=requests.get(url)
print(r.status_code)
demo=r.text
soup=BeautifulSoup(demo,"html.parser")
#获取头部子集
#print(soup.head.contents)
#获取body子集
#print(soup.body.contents[1])
#获取title父集
#print(soup.title.parent)
#获取body父集
print(soup.body.parent)
prettify()标签
在每个标签后加一个换行符\n
beautifulsoup下
编码默认utf-8
信息标记
标记后的信息科形成信息组织结构,增加信息维度
可用于通信、存储或展示
标记的结构与信息一样具有重要价值
标记的三种信息表达方式
XML JSON YAML
#soup()==find_all()
from bs4 import BeautifulSoup
import requests
url="http://python123.io/ws/demo.html"
r=requests.get(url)
print(r.status_code)
demo=r.text
soup=BeautifulSoup(demo,"html.parser")
#for link in soup.find_all("a"):
for link in soup("a"):
print(link.get("href"))
import requests
from bs4 import BeautifulSoup
import bs4
def getHTMLText(url):
try:
r=requests.get(url,timeout=30)
r.raise_for_status()
r.encoding=r.apparent_encoding
return r.text
except:
return ""
def fillUnivList(ulist, html):
soup=BeautifulSoup(html,"html.parser")
for tr in soup.find('tbody').children:
if isinstance(tr,bs4.element.Tag):
tds=tr("td")
ulist.append([tds[0].string,tds[1].string,tds[2].string])
def printUnivList(ulist, num):
tplt="{:^10}\t{1:{3}^10}\t{2:^10}"
print(tplt.format("排名","学校名称","总分",chr(12288)))
for i in range(num):
u= ulist[i]
print("{:^10}\t{:^6}\t{:^10}".format(u[0],u[1],u[2],chr(12288)))
print("Suc"+str(num))
def main():
uinfo = []
url = "http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html"
html=getHTMLText(url)
fillUnivList(uinfo,html)
print(uinfo,20)
main()