一个爬虫小例子:
import requestsimport re
import jsondef getPage(url):response=requests.get(url)return response.textdef parsePage(s):com=re.compile('.*?.*?(?P\d+).*?(?P.*?) ''.*?(?P.*?) .*?(?P.*?)评价 ',re.S)ret=com.finditer(s)for i in ret:yield {"id":i.group("id"),"title":i.group("title"),"rating_num":i.group("rating_num"),"comment_num":i.group("comment_num"),}def main(num):url='https://movie.douban.com/top250?start=%s&filter='%numresponse_html=getPage(url)ret=parsePage(response_html)print(ret)f=open("move_info7","a",encoding="utf8")for obj in ret:print(obj)data=json.dumps(obj,ensure_ascii=False)f.write(data+"\n")f.close()if __name__ == '__main__':count=0for i in range(10):main(count)count+=25
但是这个例子我跑结果的时候出现问题,没有得到返回结果,我进行了单步调试:

看到reponse的返回值是418,百度下这个应该是网站的反爬程序返回的。所以,这个程序要进行下修改:
import requests
import urllib.request
import redef getPage(url):herders = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1;WOW64) AppleWebKit/537.36 (KHTML,like GeCKO) Chrome/45.0.2454.85 Safari/537.36 115Broswer/6.0.3','Referer': 'https://movie.douban.com/','Connection': 'keep-alive'}req = urllib.request.Request(url, headers=herders)response = urllib.request.urlopen(req)html = response.read().decode('utf-8')return htmldef parsePage(s):com = re.compile('.*?.*?(?P\d+).*?(?P.*?) ''.*?(?P.*?) .*?(?P.*?)评价 ', re.S)ret = com.finditer(s)for i in ret:yield {"id": i.group("id"),"title": i.group("title"),"rating_num": i.group("rating_num"),"comment_num": i.group("comment_num"),}def main(num):url = 'https://movie.douban.com/top250?start=%s&filter=' % numresponse_html = getPage(url)ret = parsePage(response_html)for obj in ret:print(str(obj))count = 0
for i in range(10):main(count)count += 25
我们再来分析下正则表达式这块代码:
'.*?.*?(?P\d+).*?(?P.*?) ''.*?(?P.*?) .*?(?P.*?)评价 '
上面这段是正则代码:
1)
.*? :这是一个惰性匹配,只匹配到之前标签的这个位置。

2)然后再看正则表达式:
(?P\d+): 这是一个分组,然后里面\d是表示的数字,后面的加号,说明是多个数字。
前面的?P是给这个分组一个名称。那么通过group(n)就可以获得这个值。
3)compile返回的com是一个正则表达式对象。然后该对象执行finditer,由于找的内容比较多,我们就使用迭代器。
4)然后我们就返回每个分组,每个分组都有自己的名称。我们没有使用return,而是使用的yield,那说明这个函数是生成器。这样就不会一下子占用很多内存,而是你边生成边获取。节省了内存空间。
5)再来看下爬虫程序的整个过程:
1. url从网页上将代码搞下来;
2、bytes code ->utf-8 网页内容就是我们的待匹配字符串;
3、ret是所有匹配的内容组成的列表;
6)理解下正则的用法。
上一篇:Java集合 超详细版+面试题
下一篇:Postman 的简单使用
相关内容
热门资讯
银河麒麟V10SP1高级服务器...
银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
【NI Multisim 14...
目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
AWSECS:访问外部网络时出...
如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
不能访问光猫的的管理页面
光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSElasticBeans...
在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
Android|无法访问或保存...
这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
月入8000+的steam搬砖...
大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...
ToDesk 远程工具安装及...
目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
北信源内网安全管理卸载
北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWS管理控制台菜单和权限
要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...