初衷是想学机器学习,本来第一步应该是学习python的,因为我接触python已经很久了,都是自学的,用到什么去网上找例程直接拿来用,前几天又看了一些老师网上的直播课程,巩固了一下基础,印象深刻的是正则表达式,慢慢的开始对爬虫有了点了解,要处理数据首先要获取数据,这里对于模块的使用不做详细解释了,网上例子很多,主要是把走过的坑记录一下,下面是爬取豆瓣网数目的一个小栗子。
# -*- coding: utf-8 -*- """ Created on Tue Mar 12 11:21:25 2019 @author: lilide """ import requests import re try: fo = open('full.txt','w',encoding='utf-8') ''' r = requests.get('https://book.douban.com')#.text print(r.status_code) content = r.content.decode('utf-8') ''' content = requests.get('https://book.douban.com/') #print(content.text) fo.write(content.text) pattern = re.compile('<li\s?class="">.*?="more-meta">\s?.*?"title">\s(.*?)\s<.*?class="author">\s(.*?)\s?</span>', re.S) results = re.findall(pattern, content.text) #print(results) for result in results: name,author = result author = re.sub('\s','',author) name = re.sub('\s','',name) print(name,'--'*5,author) finally: fo.close#关闭文件
主要记录的地方有两个:
一个是编码格式:
fo = open('full.txt','w');上面代码编译的时候出现了:UnicodeEncodeError: 'gbk' codec can't encode character '\xbb' in position 0: illegal multibyte seque对比了一下,应该f的编码格式是GBK的
fo = open('full.txt','w',encoding='utf-8');
r = requests.get('https://book.douban.com')#.text
content = r.content.decode('utf-8')
另一个是正则表达式建立:pattern = re.compile('<li\s?class="">.*?="more-meta">\s?.*?"title">\s(.*?)\s<.*?class="author">\s(.*?)\s?</span>', re.S);
一直匹配不到,主要因为太心急,写正则表达式一定要确保你写出来的是对应的,可以找到的,对于这种长的表达式更是要细心。
# -*- coding: utf-8 -*- """ Created on Tue Mar 12 11:21:25 2019 @author: lilide """ import requests from bs4 import BeautifulSoup try: fo = open('full.txt','w',encoding='utf-8') content = requests.get('https://book.douban.com/') fo.write(content.text)#写入文件 soups = BeautifulSoup(content.text, 'lxml') author = soups.select('.more-meta .author') for i in author: print(i.string.strip())#去除空白字符 finally: fo.close#关闭文件
继续跟着学习了用BeautifulSoup抓取,真的是非常简单了,下面是结果。
runfile('C:/Users/lilide/tutorial/tutorial/spiders/untitled0.py', wdir='C:/Users/lilide/tutorial/tutorial/spiders') (日)镝木莲 艾略特.温伯格 [日]荻原浩 [美]谭旋 [法] 莱蒂西娅·科隆巴尼 魏坤琳 / 陈虎平 / 等 余秀华 日本辰巳出版株式会社 [美]玛乔丽·刘 著 / [日]武田莎娜 绘 [日]小林一茶 [日]西川美和 高林 (日) 石黑亚矢子 东东枪 [日] 深水黎一郎 [日]蜷川幸雄 [日] 松本清张 章清 [加] 沙利文·纽威尔 [英] 蒂姆·斯佩克特 [法] 威尔弗里德·卢帕诺 编 / [意] 格雷戈里·帕纳乔内 绘 [英]詹姆斯•霍斯 远宁 [加]戴维·施密茨 [英] 萨拉·沃特斯 吴琦 残雪 [英] 大卫·汤姆森 (David Thomson) 郑辰 [美]艾米·里奇(Amy·Leach) [日] 夏目漱石 [英] 杰里米·里德 [美]弗雷德里克·波尔 [日]夏目镜子 口述 / [日]松冈让 整理 [英] 朱利安·巴恩斯 [美]霍华德·马克斯 [日] 中岛敦 曾仁臻(鱼山饭宽) [德] 雷马克 [法]西蒙娜·薇依
记录一下,主要是去除空白字符,一点点的学习,只有自己动手去实现才能越来越熟练。
下面是pyquery的操作,是对前段jquery的一种直观表达。
# -*- coding: utf-8 -*- """ Created on Tue Mar 12 11:21:25 2019 @author: lilide """ html = ''' <div class="wrap"> <div id="container"> <ul class="list"> <li class="item-0">first item</li> <li class="item-1"><a href="link2.html">second item</a></li> <li class="item-0 active"><a href="link3.html"><span class="bold">third item<p>This is a paragraph.</p></span></a></li> <li class="item-1 active"><a href="link4.html">fourth item</a></li> <li class="item-0"><a href="link5.html">fifth item</a></li> </ul> </div> </div> ''' from pyquery import PyQuery as pq doc = pq(html) li = doc('.item-0.active') print(li) li.attr('name', 'link')#通过attr给标签添加和修改属性 print(li)#如果之前没有该属性则是添加,如果有则是修改 li.removeClass('active')#添加和删除属性 print(li) li.addClass('active')#添加和删除属性 print(li) li.find('p').remove()#通过remove就可以将无用的或者干扰的标签直接删除 print(li.text())
参考了coder大侠的博客,链接https://www.cnblogs.com/zhaof/p/6925674.html