MOOC_北理_python爬虫学习_2(入门入门入门级实战)

网络爬虫规则

对一般服务器,对爬虫限制有:

  1. 来源审查。 检查HTTP协议头,判断User-Agent进行限制。只响应浏览器和友好爬虫的访问。
  2. Robots协议。在网站根目录下的robots.txt文件中。建议,但非约束性。若访问量很小,不对服务器造成影响,和人类访问行为类似,可以不参考robots协议。 如京东的robots协议:http://www.jd.com/robots.txt
    / 代表根目录 * 代表所有 如: User-agent: * Disallow:/

实例:

1. 京东、亚马逊商品页面的爬取。
爬取京东里inter cpu的商品信息。

>>> import requests
>>> url = "https://item.jd.com/100005600582.html"
>>> r = requests.get(url)
>>> r.status_code
200
>>> r.encoding
'UTF-8'
>>> r.apparent_encoding
'ascii'
>>> r.encoding = r.apparent_encoding
>>> r.text[:1000]
""

#这里出现了问题。然鹅我也不知道咋回事,慕课里面都没有问题诶。。。然后查阅CSDN别人的博客后发现是要调整headers,所以接下来是。

>>> kv = {
     'user-agent':'Mozilla/5.0'}
>>> r = requests.get(url,headers = kv)
>>> r.text[:1000]
'\n\n\n    \n    \n    【英特尔酷睿i7-9700F】英特尔(Intel)i7-9700F 酷睿八核 盒装CPU处理器【行情 报价 价格 评测】-京东\n    \n    \n    \n    \n    \n    \n    \n        \n    

#这样就出现啦。
'''这里没有用标准框架。'''

好吧。但是这个问题好像在下一节“爬取亚马逊商品信息”的课程中得到解决。

>>> r.status_code
503
>>> r.request.headers
{
     'User-Agent': 'python-requests/2.23.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}

这里user-agent字段显示的是’python-requests/2.23.0’,说明python很老实地告诉服务器我这个是爬虫。然后服务器害怕这个爬虫干坏事,就加以阻拦。所以我们需要进行修改。

>>> kv = {
     'user-agent':'Mozilla/5.0'}
>>> 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'}

这时候就可以伪装成其他浏览器了。就能爬取到相应的内容。
但是有点区别,就是爬取亚马逊商品status_code 是503,然而上面那个爬取京东商品status_code是200 。而且亚马逊商品text里的内容是有显示要求输入验证码,京东的text就是一行很短的信息。

但总之,这两个的原因都是出在 headers上。更改headers就能爬取信息了。

2. 百度 360 搜索关键词提交。
百度的关键词接口:http://www.baidu.com/s?wd=keyword
360的关键词接口:http://www.so.com/s?q=keyword
只要我们替换keyword就能向搜索引擎提交关键词。

>>> import requests
>>> kv = {
     'wd':'Python'}
>>> url = 'http://www.baidu.com/s'
>>> r = requests.get(url,params = kv)
>>> r.status_code
200
>>> r.request.url
'https://wappass.baidu.com/static/captcha/tuxing.html?&ak=c27bbc89afca0463650ac9bde68ebe06&backurl=https%3A%2F%2Fwww.baidu.com%2Fs%3Fwd%3DPython&logid=11414199538487613735&signature=aea72a633959730607e6a28f8115947b×tamp=1589121879'
>>> len(r.text)
1519

以上是自己电脑上运行结果,和课堂上老师运行结果还是有很大的不同

第一是url不同,mooc中的url直接就是http://www.baidu.com/s?wd=Python
然而我自己的结果是上面很长的一串。在百度上输入这串链接后显示的是验证。验证成功后的结果就是输入Python的结果。因为上面亚马逊产品的也是因为验证码的问题,我怀疑会不会也是headers的问题,然后又尝试修改headers的信息,结果还是不行。。。。。这个问题先留着。。。有空问问老师。
但是!!试了一下360浏览器,结果是完全没问题。。。。。

>>> kv = {
     'q':'Python'}
>>> url = 'http://www.so.com/s'
>>> r = requests.get(url,params = kv)
>>> r.request.url
'https://www.so.com/s?q=Python'
>>> 

3. 网络图片的爬取和存储
网络图片链接的格式:
http://www.example.com/picture.jpg
然后就遇到问题了。。课程里说右键图片,会有属性。。。。然而我这边根本没有啥属性。。。我裂开。但硬着头皮把课程看完。。。

>>> import requests
>>> path = "D:/abc.jpg"
>>> url = 'http://tupian.baike.com/s/北京/xgtupian/2/4?target=a2_57_51_01200000000481118595150813357.jpg'
>>> r = requests.get(url)
>>> r.status_code
200
>>> with open(path,'wb') as f:
 	f.write(r.content)
 	
15555
'''response对象 r.content表示返回对象的二进制形式。所以我们可以用f.write(r.content)将返回二进制形式写入文件中'''
>>> f.close() #关闭文件。

但这个保存失败了。。。文件不支持格式。
下面是课程中的代码,很给力。

import requests
import os
url = "http://image.nationalgeographic.com.cn/2017/0211/20170211061910157.jpg"
root = "D://pics//"
path = root + url.split('/')[-1]
try:
	if not os.path.exists(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("爬取失败")

除了图片,动画、视频等格式也差不多是这个格式。也可以用这种方法保存。但他妈的我根本找不到属性啊。。。裂开来了。

4. IP地址归属地的自动查询。
iP138网页可以查询IP地址所在地。https://www.ip138.com/
输入IP地址后url发生变化,变为:https://www.ip138.com/iplookup.asp?ip=39.181.187.119&action=2
然后根据发生的变化来通过python爬取信息。
但自己尝试的时候发生了错误 error [Errno 11001] getaddrinfo failed ,和之前的不同,之前都是死在text上,然而这个是在get上直接死掉。。。。查阅他人博客发现是网页失效。可能是这个网页设置了什么高级的反爬技术?不懂3
课堂里的代码:

import requests
url = "http://m.ip138.com/ip.asp?ip="
r = requests.get(url+'XXXXXX')
r.status_code
r.text[-500:]

**

总结:

**
问题:

  1. 百度搜索关键词索引出现验证码
  2. 图片查询右键没有属性。。找不到图片的原地址
  3. IP地址查询地址失效,直接死在 r = requests.get 上。

其他:
5.9日开始记录博客。希望能坚持下去。既是笔记也是分享。(然而我感觉我写的东西应该只有自己会看,也只有自己看得懂。。。逻辑极其混乱)python爬虫学习是第一个板块。已经记录的1、2是课程中第一周的内容,由于之前三月份的时候看过一遍,现在相当于复习。进程相对较快,一个周末就补完了。接下来希望能继续坚持,每天收获一点。

你可能感兴趣的:(python)