网络爬虫与信息提取
requests库入门
安装方法
pip install requests
requests.get(url,params=None,**kwargs)
url:拟获取页面的URL链接
params:url中的额外参数,字典或字节流格式,可选
**kwargs:12个控制访问参数
爬去网页的代码框架
HTTP协议和requests库
HTTP协议,超文本传输协议 基于请求与响应模式的、无状态的应用层协议。
HTTP协议,采用URL作为定位网络资源的标识。
URL格式:http://host[:port][path]
- host:合法的Internet主机域名或者IP地址
- port:端口号,缺省为80
- path:请求资源的路径
requests.request(method,url,**kwargs) - method:请求方法,对应get/put/post等7种
- url:拟获取页面的url链接
- **kwargs:控制访问的参数,共13个
- params:字典或字节序列,作为参数增加到url中
- data:字典、字节序列活文件对象,作为request的内容
- json:JSON格式的数据,作为request的内容
- headers:字典,HTTP定制头
- cookies:字典或cookiejar,request中的cookie
- auth:元组,支持HTTP认证功能
- files:字典类型,传输文件
- timeout:设定超时时间,秒为单位
- proxies:字段类型,设定访问代理服务器,可以增加登录认证
- allow_redirects:True/False,默认为True,重定向开关
- stream:True/False,默认为True,获取内容立即下载开关
- verify:True/False,默认为True,认证SLL证书开关
- cert:本地SSL证书路径
requests.get(url,params=None,**kwargs)
- url:拟获取页面的url链接
- params:url中的额外参数,字典或字节流格式,可选
- **kwargs:12个控制访问的参数
requests.head(url,data=None,json=None,**kwargs)
- url:拟更新页面的url链接
- data:字典、字节序列或文件,request的内容
- json:JSON格式的数据,request的内容
- **kwargs:11个访问控制参数
requests.patch(url,data=NOne,**kwargs)
- url:拟更新页面的url链接
- data:字典、字节序列或文件,request的内容
- **kwargs:12个访问控制参数
requests.delete(url,**kwargs)
- url:拟删除页面的url链接
- **kwargs:13个控制访问的的参数
网络爬虫引发的问题
服务器资源
法律风险
个人隐私
robots协议
网络爬虫排除标准
作用:网站告知网络爬虫哪些页面可以抓取,那些不能抓取
形式:在网站根目录下的robot.txt文件
robots协议基本语法
#注释,*代表所有,/代表根目录
user-agent:*
Disallow:/
robots协议遵守方式
网络爬虫:自动或人工识别robots.txt,再进行内容爬取
约束性:robots协议是建议但非约束性,网络爬虫可以不遵守,但存在法律风险。
requests库网络爬虫实战(5个实例)
实例1:京东商品页面的爬取
import requests
r="https://item.jd.com/296798292.html"
try:
r=requests.get(url)
r.raise_for_status()
r.encoding=r.apparent_encoding
print(r.text[:1000])
except:
print("爬取失败")
实例2:亚马逊网页的爬取
import requests
r="https://amazon.cn/gp/product/B01M8L5Z3Y"
try:
kv={'user-agent':'Mozilla/5.0'}
r=requests.get(url,header=kv)
r.raise_for_status()
r.encoding=r.apparent_encoding
print(r.text[:1000])
except:
print("爬取失败")
实例3:百度360搜索关键词提交
import requests
try:
kv={'wd':'Python'}
r=requests.get("http://www.baidu.com/s",params=kv)
print(r.request.url)
r.raise_for_status()
print(len(r.text))
except:
print("爬取失败")
实例4:网络图片的爬取和存储
import requests
import os
url="http://image.nationalgeographic.com.cn/2017/0211/2017021106190157.jpg"
root="D://pics//"
path=root+url.split('/')[-1]
try:
if not os.path.exits(root):
os.mkdir(root)
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("爬取失败")
实例5:IP地址归属地自动查询
import requests
url="http://m.ip138.com/ip.asp?ip="
try:
r=requests.get(url+'202.204.80.112')
r.raise_for_status()
r.encoding=r.apparent_encoding
print(r.text[-500:])
except:
print("爬取失败")
解析HTML页面
beautiful soup库的安装
pip install beautifulsoup4
中国大学排名实例
功能描述:
输入大学排名URL 输出大学排名信息屏幕输出排名大学名称总分
技术路线:requests,bs4
定向爬虫:仅对输入的URL进行爬取,不扩展爬取
程序结构设计:
步骤1:从网络上获取大学排名网页内容 getHTMLText()
步骤2:提取网页内容中信息到合适的数据结构 fillUnivList()
步骤3:利用数据结构展示并输出结果 printUnivList()
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):
print("{0:^10}\t{1:{3}^10}\t{2:^10}".format("排名","学校名称","总分",char(12288)))
for i in range(num):
u=ulist[i]
print("{:^10}\t{:^6}\t{:^10}".format(u[0],u[1],u[2]))
def main():
uinfo=[]
url='url'
html=getHTMLText(url)
fillUnivList(uinfo,html)
printUnivList(uinfo,20)
采用中文字符的空格填充 char(12288)
re库入门
正则表达式概念
正则表达式
- 通用的字符串表达框架
- 简介表达一组字符串的表达式
- 针对字符串表达“简洁”和“特征”思想工具
- 判断某字符串的特征归属
正则表达式在文本处理中十分常用 - 表达文本类型的特征(病毒、入侵等)
- 同时查找或替换一组字符串
- 匹配字符串的全部或部分
正则表达式的使用 - 编译:将符合正则表达式语法的字符串转换成正则表达式特征
股票数据scrapy爬虫
步骤1:建立工程和spider模板
scrapy startproject BaiduStocks
cd BaiduStocks
scrapy genspider stocks baidu.com
步骤2:编写spider
配置stocks.py文件
修改对返回页面的处理
修改对新增URL爬取请求的处理
步骤3:编写ITEM Pipelines
import scrapy
import re
class StocksSpider(scrapy.Spider):
name="stocks"
start_urls=['http://quote.eastmoney.com/stocklist.html']
def parse(self,response):
for href in response.css('a::attr(href)').extrack():
try:
stock=re.findall(r"[s][hz]\d{6},href)[0]
url='https://gupiao.baidu.com/stock'+stock+'html'
yield scrapy.Request(url,callback=self.parse_stock)
except:
continue
def parse_stock(self,response):
infoDict={}
stockInfo=