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