在前面两节我们分别实现了两种网页的爬取方式,总不能我们每次人工判断是什么网页吧?
这不是我们的风格,我们要让电脑自动来帮我们完成。
我们来把这个小程序完善一下。
需求:1、我们可以把网址写在一个文本文件里,让程序自动获取进行爬取。
2、自动识别网页进行图片爬取。
go...................
一、把网址写在一个文本文件里,让程序自动获取
我们新建 一个文本文件命名为weixin.txt.把所有的网址写进去。
#此处有坑。weixin.txt必须是utf-8编码。在windows下右键新建文本文档是不行的(百度说这样建的文本文档是gbk编码),我只能用笨办法写一个python脚本,生成一个utf-8的weixin.txt.方法自己百度。
然后读取weixin.txt
def read_text(): """ 文件和源码必须放在一个文件夹里 """ with open('weixin.txt', 'r', encoding='utf-8') as f: return f.readlines()
二、爬取两种网页的代码定义成函数
ef pa_one(url1): """获取网页直接显示的图片""" s = requests.session() headers = {'User-Agent': 'Chrome/63.0.3239.132'} req = s.get(url1, headers=headers, verify=False) time.sleep(1) p = re.compile(r'img src="(.*?)"') lst = p.findall(req.text) for img_lst in lst: res = requests.get(img_lst) with open(str(time.time()) + '.jpg', 'wb') as f: f.write(res.content) time.sleep(0.3) def pa_two(url2): """爬取一页只显示一张图片的网页""" s = requests.session() headers = {'User-Agent': 'Chrome/63.0.3239.132'} req = s.get(url2, headers=headers, verify=False) time.sleep(1) html = req.text r = re.compile(r'http:(.*?)\\"') lst = r.findall(html) for x in range(0, len(lst), 4): img_url = re.sub(r'\\', '', lst[x]) img_url = r'http://' + img_url[2:] res = requests.get(img_url) time.sleep(0.5) with open(str(time.time()) + '.jpg', 'wb') as f: f.write(res.content) time.sleep(0.3)
三、自动识别网页类型进行爬取
听起来是不是很高大上,其实说穿了很简单的。那就是try.....except...也就是异常处理
原理就是:这个爬不到,我就用另一个。
代码如下:
if __name__ == '__main__': urls = read_text() for url in urls: url = re.sub(r'\n', '', url)#把读取的weixin.txt每行中的换行符去掉,否则爬不到见容 print(url) try: pa_one(url) time.sleep(1) print('爬取成功!') except Exception: try: pa_two(url) time.sleep(1) print('爬取成功!') except Exception: print('爬取失败!')
是不是很简单啊!
总结:1、要想写爬虫还要学js/html/requests/re等,学无止境
2、python高级用法真的很有用,还要认真的学
3、正则是个好东西
以上是我的一个学习过程,其中还有很多不足之处,请大家多提意见,帮助我进步,谢谢!