최근에 이 블로그에서 Python 크롤러를 배우기 시작했습니다. 블로거는 Python 버전 2.7을 사용하고 있는데 저는 버전 3.5를 사용하고 있지만 문제가 되지 않습니다. 직접 변경해 보세요.
우리는 웹사이트의 콘텐츠를 필터링하여 관심 있는 부분만 가져오고 싶습니다. 예를 들어, XX 웹사이트에서 음란물 사진을 걸러내고 포장하여 가져가려고 합니다. 여기서는 Baisi Bujie가 쓴 농담(일반 텍스트)을 예로 들어 간단한 구현만 수행합니다. 우리는 다음 기능을 구현하려고 합니다.
여러 페이지의 단락을 로컬 파일로 일괄 다운로드
다음 단락 읽기를 시작하려면 아무 키나 누르세요
가져오기. urllib는 Python 3에서는 다음과 같이 작성해야 합니다. urllib
的相关库,Python 3中应该这样写:
import urllib.requestimport urllib.parseimport re
re库是正则表达式(Regular Expression),后面作匹配时会用到。
百思不得姐的段子页面url ='http://www.budejie.com/text/1'
,这里末尾数字1代表此为第一页。通过以下代码就能返回网页内容。
req = urllib.request.Request(url)# 添加headers 使之看起来像浏览器在访问req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 ' '(KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36') response = urllib.request.urlopen(req)# 得到网页内容,注意必须使用decode()解码html = response.read().decode('utf-8')
print(html)
的话,就是如下所示的内容:
这能看?段子呢?我们想要的段子呢?!
哦对了headers这样查看。
按F12,然后...看图吧
要想筛选符合普通人阅读的内容(如果还带着html标签那还咋读是不),成功提取出段子,为此我们需要一些既定的模式去和网页全部内容进行匹配,将模式下匹配成功的对象返回。我们使用强大的正则表达式进行匹配(Regular Expression),相关语法可以看这里。
仅仅针对本例中的网页内容,先看看我们需要的段子对应了网页中的什么内容。
可以看到段子被5b0fad1dab3da7dcd513889256dead2f(我们要的内容)16b28748ea4df4d9c2150843fecfba68
这样的标签所包围,只需要指定相应规则提取出来即可!上图可以看出段子正文前后是有很多空格的,需要匹配进去。
pattern = re.compile(r'<div class="j-r-list-c-desc">\s+(.*)\s+</div>') result = re.findall(pattern, html)
通过
re
库的compile
函数制定规则。
s+
可以匹配一个或更多的空格
.
匹配除开换行符n
外的所有字符。
现在我们得到了匹配后的结果,来看下。
Bingo!提取出来了不是?!
可是我们发现里面还有些讨厌的df250b2156c434f3390392d09b1c9563
。没关系,写几行代码的事。这里就不再展示去掉后的内容,自行脑补哈哈。
for each in content:# 如果某个段子里有<br />if '<br />' in each:# 替换成换行符并输出new_each = re.sub(r'<br />', '\n', each)print(new_each)# 没有就照常输出else:print(each)
这里
content
是我们通过re.findall()
返回的列表。
至此,我们成功得到我们想看的段子了!如果想要下载到本地呢?
通过定义一个save()
函数即可,num
参数用户自定,想下载最近100页的内容都没问题!里面还有些变量没有提到,最后会给出源代码。
# num是指定网页页数def save(num):# 写方式打开一个文本,把获取的段子列表存放进去with open('a.txt', 'w', encoding='utf-8') as f: text = get_content(num)# 和上面去掉<br />类似for each in text:if '<br />' in each: new_each = re.sub(r'<br />', '\n', each) f.write(new_each)else: f.write(str(each) + '\n')
下载到本地文档后如下图所示
段子太多,琳琅满目。可我们只希望一条条阅读。通过按下键盘任意键可以切换到下一条,直到读取到最后一条程序才结束,或者通过设置一个退出键随时退出程序,比如设定q
import urllib.requestimport urllib.parseimport re
pattern = re.compile(r'
' in each:
new_each = re.sub(r'
', '\n', each)print(new_each)else:print(each)# 用户输入user_input = input()# 不区分大小写的q,输入则退出if user_input == 'q' or user_input == 'Q':break
Baidejie의 농담 페이지 url ='http://www.budejie.com/text/1'
, 여기 끝에 있는 숫자 1은 이것이 첫 번째 페이지라는 의미입니다. 다음 코드는 웹 페이지의 콘텐츠를 반환할 수 있습니다.
print(html)
, 내용은 다음과 같습니다:
이거 볼 수 있나요? 농담은 어디에 있습니까? 우리가 원하는 농담은 어떻습니까? !
아 그런데 헤더는 이렇게 확인해보세요. 🎜🎜F12를 누르고...사진을 보세요🎜🎜🎜🎜 🎜 2. 농담 추출을 위한 정규 매칭 🎜🎜 일반 사람들이 읽기에 적합한 콘텐츠를 필터링하고(아직 HTML 태그가 있는 경우 어떻게 읽을 수 있습니까?) 농담을 성공적으로 추출하려면 몇 가지 확립된 패턴이 필요합니다. 웹 페이지의 전체 내용을 일치시키려면 일치를 수행하고 성공적으로 일치된 객체를 패턴으로 반환합니다. 일치를 위해 강력한 정규식(정규식)을 사용합니다. 관련 구문은 여기에서 찾을 수 있습니다. 🎜🎜이 예의 웹페이지 콘텐츠에 대해서만 먼저 필요한 단락이 웹페이지의 어떤 콘텐츠에 해당하는지 살펴보겠습니다. 🎜🎜🎜🎜문단이7cacf1f4f8d0d781c8ed7f2634cc989d(원하는 콘텐츠)16b28748ea4df4d9c2150843fecfba68
와 같은 태그로 둘러싸여 있으며, 이를 추출하려면 해당 규칙만 지정하면 됩니다! 위의 그림에서 볼 수 있듯이 문단의 텍스트 앞뒤에 공백이 많아 일치해야 합니다. 🎜🎜🎜rrreee🎜🎜🎜 re
라이브러리의 compile
기능을 통해 규칙을 만드세요. 🎜🎜🎜🎜s+
는 하나 이상의 공백과 일치할 수 있습니다. 🎜🎜🎜🎜.
는 개행 문자 n
을 제외한 모든 문자와 일치합니다. 🎜🎜🎜🎜🎜이제 일치하는 결과가 나왔으니 살펴보겠습니다. 🎜🎜🎜🎜빙고! 추출된 거 맞죠? ! 🎜🎜하지만 df250b2156c434f3390392d09b1c9563
에 불쾌한 내용이 포함되어 있다는 사실을 발견했습니다. 상관없습니다. 코드 몇 줄만 작성하면 됩니다. 여기서는 삭제된 콘텐츠를 표시하지 않겠습니다. 알아서 결정하세요 하하. 🎜🎜rrreee🎜🎜🎜여기 content
는 re.findall()
을 통해 반환되는 목록입니다. 🎜🎜🎜이제 보고싶은 개그는 성공적으로 얻었습니다! 로컬로 다운로드하고 싶다면 어떻게 해야 합니까? 🎜🎜3. 농담을 로컬로 다운로드합니다. 🎜🎜save()
함수를 정의하면 num
매개변수가 사용자 정의되어 콘텐츠를 다운로드하는 데 문제가 없습니다. 마지막 100페이지 중! 언급되지 않은 변수도 있으며, 소스코드는 마지막에 공개하겠습니다. 🎜🎜rrreee🎜🎜로컬 문서로 다운로드 후 아래와 같이🎜🎜🎜 🎜4. 농담을 하나씩 읽어보세요 🎜🎜 농담이 너무 많고 눈부신 배열이 있습니다. 하지만 우리는 그것들을 하나씩 읽고 싶습니다. 키보드의 아무 키나 눌러 다음 항목으로 전환할 수 있으며, 마지막 항목을 읽을 때까지 프로그램이 종료되지 않거나 설정 등 종료 키를 설정하여 언제든지 프로그램을 종료할 수 있습니다. q 키를 눌러 종료하세요. 🎜전체 코드는 여기에 제공됩니다. 🎜🎜🎜rrreee🎜🎜 시연해보시면 효과는 이렇습니다. 🎜🎜🎜🎜🎜기능이 매우 쓸모가 없지만 초보자로서 여전히 매우 만족합니다. 관심이 있어야만 더 깊이 들어갈 수 있습니다! 크롤러는 그것뿐만 아니라 앞으로 더 고급 기능을 배우게 될 것입니다. 🎜🎜🎜🎜by @sunhaiyu🎜🎜2016.8.15🎜위 내용은 초보자를 위한 Python 크롤러: 크롤링 농담의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!