mooc课程地址:
https://www.icourse163.org/learn/BIT-1001870001?tid=1003245012#/learn/announce
规模 | 小规模,数据量小 | 中规模,数据规模较大 | 大规模,搜索引擎 |
---|---|---|---|
爬取速度敏感程度 | 不敏感 | 敏感 | 爬取速度关键 |
常用库 | Requests库 | Scrapy库 | 定制开发 |
适用范围 | 爬取网页玩转网页 | 爬取网站爬取系列网站 | 爬取全网 |
cmd直接使用pip下载Requests库: 速度时常在20KB以内
pip install requests
使用国内镜像:
注意:新版ubuntu要求使用https源
清华:https://pypi.tuna.tsinghua.edu.cn/simple
阿里云:http://mirrors.aliyun.com/pypi/simple/
中国科技大学:https://pypi.mirrors.ustc.edu.cn/simple/
华中理工大学:http://pypi.hustunique.com/
山东理工大学:http://pypi.sdutlinux.org/
豆瓣:http://pypi.douban.com/simple/
pip install -i http://pypi.douban.com/simple/ requests
import requests
def getHTMLText(url):
try :
r = requests . get (ur1, timeout= =30)
r. raise for status () #如果状态不是200, 引发HTTPError异常
r. encoding = r. apparent_ encoding
return r. text
except :
return "产生异常"
if _name_ == "_main_";
ur1 = "http: / /www . baidu. com"
print (getHTMLText (ur1) )
方法 | 说明 |
---|---|
requests. request() | 构造一个请求,支撑以下各方法的基础方法 |
requests. get( ) | 获取HTML网页的主要方法,对应于HTTP的GET |
requests . head( ) | 获取HTML网页头信息的方法,对应于HTTP的HEAD |
requests. post( ) | 向HTML网页提交POST请求的方法,对应于HTTP的POST |
requests. put( ) | 向HTML网页提交PUT请求的方法,对应于HTTP的PUT |
requests . patch() | 向HTML网页提交局部修改请求,对应于HTTP的PATCH |
requests . delete() | 向HTML页面提交删除请求,对应于HTTP的DELETE |
requests. request (method, url, **kwargs)
●method : 请求方式,对应get/put/post等7种
●url:拟获取页面的ur1链接
● **kwargs: 控制访问的参数,共13个
由于网站信息涉密或涉及用户个人信息等,或访问时可能会对服务器造成资源影响,我们在爬取网站信息时,需要遵守robots协议。
示例(京东的robots协议):https://www.jd.com/robots.txt
#不允许访问内容
#注释:*代表所有,/代表根目录
User-agent: *
Disallow: /?*
Disallow: /pop/*.html
Disallow: /pinpai/*.html?*
#恶意爬虫
User-agent: EtaoSpider
Disallow: /
User-agent: HuihuiSpider
Disallow: /
User-agent: GwdangSpider
Disallow: /
User-agent: WochachaSpider
Disallow: /
网络爬虫:自动或人工识别robots.txt,再进行内容爬取。
约束性: Robots协议是建议但非约束性,网络爬虫可以不遵守,但存在法律风险。
对Robots协议的理解:
访问量很小:可以遵守 访问量较大:建议遵守 |
非商业且偶尔:建议遵守 商业利益:必须遵守 |
必须遵守 |
---|---|---|
爬取网页 玩转网页 | 爬取网站爬取系列网站 | 爬取全网 |
特别的,当程序较小,每天只访问服务器几次,与人类的访问行为十分类似(即类人行为),对服务器不会造成巨大的资源影响时,可不参考robots协议,但要注意所爬取的资源不能作为商用。
直接在idle中进行操作
#加载requests库
import requests
#复制京东商品链接(以华为Mate20Pro为例),利用get方法获取链接内容
r = requests.get("https://item.jd.com/100000986034.html")
r.status_code #返回状态码
>>>200
r.encoding #返回编码
>>>'gbk'
r.text[:1000] #查看返回内容
>>>'\n\n\n \n \n 【华为Mate 20 Pro】华为 HUAWEI Mate 20 Pro 麒麟980芯片全面屏超微距影像超大广角徕卡三摄6GB+128GB翡冷翠全网通版双4G手机【行情 报价 价格 评测】-京东 \n \n \n \n \n \n \n \n
全代码
import requests
ur1 = "https://item.jd.com/100000986034.html."
try :
r = requests.get (ur1)
r.raise_for_status ()
r.encoding = r . apparent_ encoding
print (r. text[:1000] )
except :
print("爬取失败")
(重点:通过headers字段让代码模拟浏览器向亚马逊提出http请求)
直接在idle中进行操作
import requests
r.request.headers #查看访问请求
>>>{'User-Agent': 'python-requests/2.21.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
kv = {'user-agent':'Mozilla/5.0'}
url = "https://www.amazon.cn/dp/B07JW1TLQS/ref=sr_1_4?s=wireless&ie=UTF8&qid=1551188400&sr=1-4&keywords=%E5%8D%8E%E4%B8%BA"
r = requests.get(url, headers = kv)
r.status_code
>>>200
r.request.headers
>>>{'user-agent': 'Mozilla/5.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
r.text[:1000]
>>>'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n\n\r\n\r\n'