200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > python爬虫requests库的使用及python正则表达式的使用

python爬虫requests库的使用及python正则表达式的使用

时间:2018-09-13 23:06:23

相关推荐

python爬虫requests库的使用及python正则表达式的使用

#使用requests库爬取猫眼电影排行榜# encoding=utf-8import reimport requestsimport jsonfrom requests.exceptions import RequestExceptiondef get_open_page(url):try:# 请求头 添加user-agent用于伪装浏览器headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',}#使用localhost作为代理服务器proxies ={'http': 'http://127.0.0.1'}reponse = requests.get(url,headers=headers,timeout=3,proxies=proxies)# 设置编码 不设置可能出现乱码reponse.encoding = 'utf-8'if reponse.status_code == 200:return reponse.textreturn Noneexcept RequestException:return Nonedef main():# 爬取排名前100的电影for i in range(0,10):url = '/board/4?offset=';url = url + str(i*10)html = get_open_page(url)# 使用正则表达式筛选pattern = pile('<dd>.*?board-index.*?>(.*?)</i>.*?name.*?a.*?>(.*?)</a>.*?star.*?>\s+(.*?)\s+.*?</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>',re.S)result = re.findall(pattern, html)dic = {}for items in result:dic = {'top:': items[0],'name:': items[1],'stars:': items[2],'releasetime:': items[3],'score':items[4]+items[5]}print (dic)main()

补充:有关python中正则表达式的部分用法

常规的匹配规则

模式 描述

\w 匹配字母、数字及下划线

\W匹配不是字母、数字及下划线的字符

\s 匹配任意空白字符,等价于[\t\n\r\f]

\S 匹配任意非空字符

\d 匹配任意数字,等价于[0-9]

\D匹配任意非数字的字符

\A匹配字符串开头

\Z匹配字符串结尾,如果存在换行,只匹配到换行前的结束字符串

\z匹配字符串结尾,如果存在换行,同时还会匹配换行符

\G匹配最后匹配完成的位置

\n匹配一个换行符

\t匹配一个制表符

^ 匹配一行字符串的开头

$匹配一行字符串的结尾

. 匹配任意字符,除换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符

[...] 用来表示一组字符,单独列出,比如[amk]匹配a、m或k

[^...] 不在[]中的字符,比如[^abc]匹配除a、b、c以外的任意字符

*匹配0个或者多个表达式

+匹配1个或者多个表达式

? 匹配0个或者1个前面的正则表达式定义片段,非贪婪方式

{n} 精确匹配n个前面的表达式

{n,m} 匹配n到m次由前面正则表达式定义的片段,贪婪方式

a|b 匹配a或者b

() 匹配括号内的表达式,也表示一个组

match(),向它传入要匹配的字符串以及正则表达式,就可以检测这个正则表达式是否匹配字符串。

import recontent = 'Hello 123 4567 World_this is a Regex Demo'print(len(content))result = re.match('Hello\s\d\d\d\s\d{4}\s\w{10}',content)print resultprint (result.group())

findall(),搜索整个字符串,然后返回正则表达式中所有匹配的内容。

compile(),将正则字符串编译为正则表达式对象,以便后面匹配中复用。

贪婪与非贪婪

# 贪婪方式import recontent = 'Hello 1234567 World_this is a Regex Demo'result = re.match('^He.*(\d+).*Demo$',content)print(result.group(1))# 输出的结果为7,在贪婪匹配下,.*会匹配尽可能多的字符。He后面的.*将123456匹配了,给\d+留下的只有7。所以我们需要用非贪婪方式。非贪婪方式匹配的写法为.*?# 非贪婪方式import recontent = 'Hello 1234567 World_this is a Regex Demo'result = re.match('^He.*?(\d+).*?Demo$',content)print(result.group(1))# 输出的结果为1234567

实例:

就拿上面爬虫的正则表达式为例。

网页源代码:

<div class="content"><div class="wrapper"><div class="main"><p class="update-time">-01-09<span class="has-fresh-text">已更新</span></p><p class="board-content">榜单规则:将猫眼电影库中的经典影片,按照评分和评分人数从高到低综合排序取前100名,每天上午10点更新。相关数据来源于“猫眼电影库”。</p><dl class="board-wrapper"><dd><i class="board-index board-index-1">1</i><a href="/films/1203" title="霸王别姬" class="image-link" data-act="boarditem-click" data-val="{movieId:1203}"><img src="///bs/?f=myfe/mywww:/image/loading_2.e3d934bf.png" alt="" class="poster-default" /><img data-src="/movie/20803f59291c47e1e116c11963ce019e68711.jpg@160w_220h_1e_1c" alt="霸王别姬" class="board-img" /></a><div class="board-item-main"><div class="board-item-content"><div class="movie-item-info"><p class="name"><a href="/films/1203" title="霸王别姬" data-act="boarditem-click" data-val="{movieId:1203}">霸王别姬</a></p><p class="star">主演:杨永超,宋小川,张进战</p><p class="releasetime">上映时间:1993-01-01</p> </div><div class="movie-item-number score-num"><p class="score"><i class="integer">9.</i><i class="fraction">6</i></p> </div></div></div></dd><dd><i class="board-index board-index-2">2</i><a href="/films/1297" title="肖申克的救赎" class="image-link" data-act="boarditem-click" data-val="{movieId:1297}"><img src="///bs/?f=myfe/mywww:/image/loading_2.e3d934bf.png" alt="" class="poster-default" /><img data-src="/movie/283292171619cdfd5b240c8fd093f1eb255670.jpg@160w_220h_1e_1c" alt="肖申克的救赎" class="board-img" /></a><div class="board-item-main"><div class="board-item-content"><div class="movie-item-info"><p class="name"><a href="/films/1297" title="肖申克的救赎" data-act="boarditem-click" data-val="{movieId:1297}">肖申克的救赎</a></p><p class="star">主演:乔·劳格诺,斯科特·曼,约翰·霍顿</p><p class="releasetime">上映时间:1994-10-14(美国)</p> </div><div class="movie-item-number score-num"><p class="score"><i class="integer">9.</i><i class="fraction">5</i></p> </div></div></div></dd><dd>

正则表达式:pattern = ‘<dd>.*?board-index.*?>(.*?)</i>.*?name.*?a.*?>(.*?)</a>.*?star.*?>\s+(.*?)\s+.*?</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>’

我们所需要的内容都放在(.*?)中。

每个影片的名字,主演等信息都写在一个<dd>标签中。

所以正则表达式开头为<dd>,由<dd>到border-index之间没有我们需要的内容所以使用.*?匹配

排名前面有个标志:border-index,我们需要将其写入正则表达式中,告诉系统我们已经匹配到<i class="board-index board-index-1">1</i>处了,由于border-index后面还有一部分我们不需要的内容,所以还要使用.*?进行匹配。到>1</i>时,我们需要在正则表达式中加入>,告诉系统下面将要匹配到我们需要的内容,需要的内容用(.*? ),然后再加上</i>告诉系统我们所需要匹配的内容在</i>处结束。后面的写法与此类似,就不一一进行讲解。

通过使用pattern1=pile(pattern)编译为正则表达式对象,再使用re.findall(pattern1,text);(text为所需匹配的内容)findall方法会将所匹配的内容生成元组。直接输出元组就可以得到我们需要的内容。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。