二月就快过去一半,一月立的计划还能完成吗?
赶紧总结一波,加快进度。
今天主要写两个东西,1是关于Python正则爬取的一个练习和心得。2是关于一个比较通俗的文字识别的原理,觉得比较有趣,分享一下。
一:Py练习
库的准备
Requests;re
目的:爬取糗事百科的段子。 如图:
正则表达是第二个我学到的网络爬虫方法。(第一个是利用requests和Beatutifulsoup库解析网页。可以在我上一个月的文章中查看我的问题和全部代码。)
但是上个月最后我在做一些复杂的网页内容爬取的时候,发现除了很多的障碍,无法实现。
正则表达式爬取网页内容,从我个人的理解上来说,相比与requests,它是直接通过网页源代码中的数据,通过相应的网页代码爬取对应内容。而不是上一种方法是通过网页标签中去copy selector。(个人观点,可能之后我会发现这个描述不准确)
本次使用到的一个正则表达式:(.*?)
这个是非贪心算法,匹配任意的字符。
其他比较常用的正则表达式:
\D用于匹配非数字字符
\S匹配非空白字符
\s匹配任何空白字符,包括符号。
举例:a='xxIxxamxxnotxxstupidxxhaxx'
infos=re.findall('xx(.*?)xx',a)
print(infos)
结果
['I', 'am', 'not',’stupid,’ha’’]
爬取操作:
1浏览网址结构2找到网址构造规律。http://www.qiushibaike.com/text/page/1-n
然后打开网页查看源代码,寻找我们所需要的元素。
这里,我提取了姓名性别,等级,内容,评论等信息。
我个人的学习过程中,发现有一些的信息在网页源代码中不完全以我们所认为的中文信息表达。比如性别。上次的爬取中,性别是以1,2来区分。这次的网页源代码中,我们可以看到是以womanIcon和manIcon进行区分。因此,这次构造性别判断函数:
defjudgment_sex(class_name):
ifclass_name=='womenIcon':
return"女"
else:
return'男'
正则表达式不需要进行copyselector,而是直接copy网页源代码中相关信息的字条。
(一开始我是手动输入的,后来我发现可以通过copy字段的方式复制相关代码。)
接下来创建列表,将提取出的元素放入列表中。
格式我自己提炼为:
a,b,c,d in zip(a,b,c,d)
List ={
‘a’:a;
‘b’:b;
‘c’:c;
‘d’:d;
}
List_lists.append(list)
这些都创建完成后,进入主程序入口,写下URL的循环。例如需要5页的数据,可以写这样的函数:{}/'.format(str(i))foriinrange(1,5)
最后,写入目标的txt文档,完成。
小反思:这次的实验我发现不需要利用sleep函数来保证爬取间隔。
在整理爬虫结果时,可以用一些格式符号来增加爬取结果的可读性。如\n
结果如图:
另外全部代码如下:
importrequests
importre
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'
}
info_lists= []
defjudgment_sex(class_name):
ifclass_name=='womenIcon':
return"女"
else:
return'男'
defget_info(url):
res=requests.get(url)
ids=re.findall('(.*?)',res.text,re.S)
levels=re.findall('
(.*?)
',res.text,re.S)
sexs=re.findall('
',res.text,re.S)
contents=re.findall('
.*?(.*?)',res.text,re.S)
laughs=re.findall('(\d+)',res.text,re.S)
comments=re.findall('(\d+)评论',res.text,re.S)
forid,level,sex,content,laugh,commentinzip(ids,levels,sexs,contents,laughs,comments):
info={
'id':id,
'level':level,
'sex':judgment_sex(sex),
'content':content,
'laugh':laugh,
'comment':comment
}
info_lists.append(info)
if__name__=='__main__':
urls= ['http://www.qiushibaike.com/text/page/{}/'.format(str(i))foriinrange(1,5)]
forurlinurls:
get_info(url)
forinfo_listininfo_lists:
f=open('E:/xiaoshuo.text','a+')
try:
f.write(info_list['id'] +'\n')
f.write(info_list['level'] +'\n')
f.write(info_list['sex'] +'\n')
f.write(info_list['content'] +'\n')
f.write(info_list['laugh'] +'\n')
f.write(info_list['comment'] +'\n')
f.close()
exceptUnicodeDecodeError:
pass
二,关于文字识别的一个小文章。
原来一直以为文字识别就是类似比对模板,今天看到一个介绍,感觉还有点意思。
大致是说:
1Theconvolutionalneuralnetwork(CNN)接收到字母信息后,将字母拆解,为如下形状
2每一个独立的字母都有自己特殊的构成,以A为例,可以看到第二个图中,A的元素组合是其他字母不具备的。
3将此规律类推,得出整个文章。
字母识别信息来源:(https://www.mckinsey.com/business-functions/mckinsey-analytics/our-insights/an-executives-guide-to-ai)
其实这个做法,可能很多有兴趣了解这方面的人很早就知道了。但是一开始我想这个事的做法,就是将一个整体的模板制作出来,然后将被识别的字母与模板进行匹配来识别。
但是他的这个做法应该是更有效率的。我想到的就是面对一个整体的问题,也许从宏观上直接套用模板,有时并不是一个好的做法。当把问题拆散细分再找规律也许会更好。(同样适用于这几天爬网页的过程)
祝狗年吉祥!
领取专属 10元无门槛券
私享最新 技术干货