在前段时间玩爬虫的时候,突然想到了一个好点子。用那个爬虫,先是爬取了整个网页的html,然后把这html先存起来。这样由于分析的时候需要不断尝试而对其他服务器要造成大量的负担的影响也就消除 。因为只需要分析这个html的文件即可。(别太粗鲁,对方维护服务器的也是同行,别对别人造成太大麻烦)
- 但由于之前我在上班,所以就没能细细总结,粗糙的做了一个。大家对比这篇文章的爬虫来发现我做了哪些改变,这样学起来效率更高 废话不说,上重点
爬取对象
- 这里的url(网址)写的是
百度
的,原因很简单,百度每天能接受那么多次对它官网的访问,多那么几次的简单爬取,也不会造成太大负担。
爬取结构
- 先得到
百度
的网页的html - 将文件写入到对应的文档中
爬取的技巧总结
- 用到了re这个库
- 爬取的时候使用了ip代理
- 爬取的时候,会根据url生成对应html储存文件,格式可以自己变
爬取技巧详解
1. re正则表达式的使用
用在了筛选出特定名字来构建我想要的html文件名
pattern='((?<=\.)|(?<=/))(\w+)(?=\.com)'
这句话其实就是我设置的模式串
意思很简单,就是,这个串前面是 .
或者是/
,但后面一定是.com
的中间那个部分。通过这个模式串,我们就可以将中间部分给筛选出来。
比如:
https://www.baidu.com
的结果是 baidu
https://abc.com
的结果是abc
这里用的是re中的search方法,re.search(pattern, string)
【有人可能会问】为什么会有一个 re.purge()
【答】: 这个是为了实现re的清除缓存的效果的,一般情况,不加也是对的。但清了会比较好,这样避免了多次使用正则表达式而导致速度降慢。
2. IP代理的使用
这个原来也很简单的,哈哈哈。以前一直以为需要很高技术才能实现呢。
proxies
这个东西,就是我们用IP的参数了。
具体传进去的时候,放的东西的话就是下面这个东西了
proxies = {'HTTPS': 'https://218.27.166.198:80'}
在requests发请求的时候,就用req = requests.get(url, headers=headers, proxies=proxies)
这句话就好了。
3. OS库的使用
os.getcwd()
还有 os.path.join()
是我比较常用的函数。
- 第一个是得到当前文件目录
- 第二个是为了将两个文件目录给拼接起来,至于为什么不用自己加
/
的方式,主要还是为了避免由于不同的操作系统而导致的对这个地方的不断修改。用这样的一个函数就可以避免了。个人经验,不过觉得很有道理,哈哈哈(手动叉腰ing
4. 文件流
我这处理的时候,我用的都是wb
和rb
说明我是将这数据都存储为二进制文件了。刚刚摸索出来的,这样就可以避免了以前做的很多很蠢的replace操作了hhhh
源代码在此!
import requests
import os
import re
def getToThetxt(url, headers, proxies, pattern='((?<=\.)|(?<=/))(\w+)(?=\.com)', format='txt'):
req = requests.get(url, headers=headers, proxies=proxies)
req.encoding = req.apparent_encoding
name = re.search(pattern, url)
if name:
name = name.group() + '.%s' % format
else:
raise Exception("Wrong url: %s" % url)
re.purge() # re的清除缓存
path = os.getcwd()
with open(os.path.join(path, name), 'wb') as f:
f.write(req.text.encode())
return name
def gethtmlfromtxt(name, path=os.getcwd(), format='txt'):
with open(os.path.join(path, name + '.%s' % format), 'rb') as f:
return f.read()
if __name__ == '__main__':
url = 'https://www.baidu.com/'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'}
proxies = {'HTTPS': 'https://218.27.166.198:80'} # ip代理
# name = getToThetxt(url, headers, proxies) # 爬取网页的时候记得把这个东西给取消注释(这样就可以了)
print(gethtmlfromtxt('baidu')) # print(gethtmlformtxt(name)) # 这里传的是文件名
网友评论