>  기사  >  백엔드 개발  >  초보자를 위한 Python 크롤러: 크롤링 농담

초보자를 위한 Python 크롤러: 크롤링 농담

巴扎黑
巴扎黑원래의
2017-06-23 16:28:581309검색

최근에 이 블로그에서 Python 크롤러를 배우기 시작했습니다. 블로거는 Python 버전 2.7을 사용하고 있는데 저는 버전 3.5를 사용하고 있지만 문제가 되지 않습니다. 직접 변경해 보세요.

우리는 웹사이트의 콘텐츠를 필터링하여 관심 있는 부분만 가져오고 싶습니다. 예를 들어, XX 웹사이트에서 음란물 사진을 걸러내고 포장하여 가져가려고 합니다. 여기서는 Baisi Bujie가 쓴 농담(일반 텍스트)을 예로 들어 간단한 구현만 수행합니다. 우리는 다음 기능을 구현하려고 합니다.

  • 여러 페이지의 단락을 로컬 파일로 일괄 다운로드

  • 다음 단락 읽기를 시작하려면 아무 키나 누르세요

1. 웹 페이지 코드 가져오기

가져오기. 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)的话,就是如下所示的内容:

초보자를 위한 Python 크롤러: 크롤링 농담

这能看?段子呢?我们想要的段子呢?!

哦对了headers这样查看。

按F12,然后...看图吧

초보자를 위한 Python 크롤러: 크롤링 농담

2. 正则匹配提取段子

要想筛选符合普通人阅读的内容(如果还带着html标签那还咋读是不),成功提取出段子,为此我们需要一些既定的模式去和网页全部内容进行匹配,将模式下匹配成功的对象返回。我们使用强大的正则表达式进行匹配(Regular Expression),相关语法可以看这里。

仅仅针对本例中的网页内容,先看看我们需要的段子对应了网页中的什么内容。

초보자를 위한 Python 크롤러: 크롤링 농담

可以看到段子被5b0fad1dab3da7dcd513889256dead2f(我们要的内容)16b28748ea4df4d9c2150843fecfba68这样的标签所包围,只需要指定相应规则提取出来即可!上图可以看出段子正文前后是有很多空格的,需要匹配进去。

pattern = re.compile(r&#39;<div class="j-r-list-c-desc">\s+(.*)\s+</div>&#39;)
result = re.findall(pattern, html)

通过re库的compile函数制定规则。

  • s+可以匹配一个或更多的空格

  • .匹配除开换行符n外的所有字符。

现在我们得到了匹配后的结果,来看下。

초보자를 위한 Python 크롤러: 크롤링 농담

Bingo!提取出来了不是?!

可是我们发现里面还有些讨厌的df250b2156c434f3390392d09b1c9563。没关系,写几行代码的事。这里就不再展示去掉后的内容,自行脑补哈哈。

    for each in content:# 如果某个段子里有<br />if &#39;<br />&#39; in each:# 替换成换行符并输出new_each = re.sub(r&#39;<br />&#39;, &#39;\n&#39;, each)print(new_each)# 没有就照常输出else:print(each)

这里content是我们通过re.findall()返回的列表。

至此,我们成功得到我们想看的段子了!如果想要下载到本地呢?

3. 下载段子到本地

通过定义一个save()函数即可,num参数用户自定,想下载最近100页的内容都没问题!里面还有些变量没有提到,最后会给出源代码。

# num是指定网页页数def save(num):# 写方式打开一个文本,把获取的段子列表存放进去with open(&#39;a.txt&#39;, &#39;w&#39;, encoding=&#39;utf-8&#39;) as f:
        text = get_content(num)# 和上面去掉<br />类似for each in text:if &#39;<br />&#39; in each:
                new_each = re.sub(r&#39;<br />&#39;, &#39;\n&#39;, each)
                f.write(new_each)else:
                f.write(str(each) + &#39;\n&#39;)

下载到本地文档后如下图所示

초보자를 위한 Python 크롤러: 크롤링 농담

4. 逐条读取段子

段子太多,琳琅满目。可我们只希望一条条阅读。通过按下键盘任意键可以切换到下一条,直到读取到最后一条程序才结束,或者通过设置一个退出键随时退出程序,比如设定q

import urllib.requestimport urllib.parseimport re

pattern = re.compile(r'
\s+(.*)\s+
')# 返回指定网页的内容def open_url(url): req = urllib.request.Request(url) 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) html = response.read().decode('utf-8')return html# num为用户自定,返回的是所有页的段子列表def get_content(num):# 存放段子的列表text_list = []for page in range(1, int(num)): address = 'http://www.budejie.com/text/' + str(page) html = open_url(address) result = re.findall(pattern, html)# 每一页的result都是一个列表,将里面的内容加入到text_listfor each in result: text_list.append(each)return text_list# num是指定网页页数def save(num):# 写方式打开一个文本,把获取的段子列表存放进去with open(&#39;a.txt&#39;, &#39;w&#39;, encoding=&#39;utf-8&#39;) as f: text = get_content(num)# 和上面去掉<br />类似for each in text:if &#39;<br />&#39; in each: new_each = re.sub(r&#39;<br />&#39;, &#39;\n&#39;, each) f.write(new_each)else: f.write(str(each) + &#39;\n&#39;) if __name__ == '__main__':print('阅读过程中按q随时退出') number = int(input('想读几页的内容: ')) content = get_content(number + 1)for each in content:if '
' 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

re 라이브러리는 정규식(Regular Expression)이며 나중에 매칭에 사용됩니다.


Baidejie의 농담 페이지 url ='http://www.budejie.com/text/1', 여기 끝에 있는 숫자 1은 이것이 첫 번째 페이지라는 의미입니다. 다음 코드는 웹 페이지의 콘텐츠를 반환할 수 있습니다. 초보자를 위한 Python 크롤러: 크롤링 농담

rrreee

print(html), 내용은 다음과 같습니다:

초보자를 위한 Python 크롤러: 크롤링 농담

이거 볼 수 있나요? 농담은 어디에 있습니까? 우리가 원하는 농담은 어떻습니까? !

아 그런데 헤더는 이렇게 확인해보세요. 🎜🎜F12를 누르고...사진을 보세요🎜🎜초보자를 위한 Python 크롤러: 크롤링 농담🎜🎜 🎜 2. 농담 추출을 위한 정규 매칭 🎜🎜 일반 사람들이 읽기에 적합한 콘텐츠를 필터링하고(아직 HTML 태그가 있는 경우 어떻게 읽을 수 있습니까?) 농담을 성공적으로 추출하려면 몇 가지 확립된 패턴이 필요합니다. 웹 페이지의 전체 내용을 일치시키려면 일치를 수행하고 성공적으로 일치된 객체를 패턴으로 반환합니다. 일치를 위해 강력한 정규식(정규식)을 사용합니다. 관련 구문은 여기에서 찾을 수 있습니다. 🎜🎜이 예의 웹페이지 콘텐츠에 대해서만 먼저 필요한 단락이 웹페이지의 어떤 콘텐츠에 해당하는지 살펴보겠습니다. 🎜🎜초보자를 위한 Python 크롤러: 크롤링 농담🎜🎜문단이 7cacf1f4f8d0d781c8ed7f2634cc989d(원하는 콘텐츠)16b28748ea4df4d9c2150843fecfba68와 같은 태그로 둘러싸여 있으며, 이를 추출하려면 해당 규칙만 지정하면 됩니다! 위의 그림에서 볼 수 있듯이 문단의 텍스트 앞뒤에 공백이 많아 일치해야 합니다. 🎜🎜🎜rrreee🎜🎜🎜 re 라이브러리의 compile 기능을 통해 규칙을 만드세요. 🎜🎜🎜🎜s+는 하나 이상의 공백과 일치할 수 있습니다. 🎜🎜🎜🎜.는 개행 문자 n을 제외한 모든 문자와 일치합니다. 🎜🎜🎜🎜🎜이제 일치하는 결과가 나왔으니 살펴보겠습니다. 🎜🎜초보자를 위한 Python 크롤러: 크롤링 농담🎜🎜빙고! 추출된 거 맞죠? ! 🎜🎜하지만 df250b2156c434f3390392d09b1c9563에 불쾌한 내용이 포함되어 있다는 사실을 발견했습니다. 상관없습니다. 코드 몇 줄만 작성하면 됩니다. 여기서는 삭제된 콘텐츠를 표시하지 않겠습니다. 알아서 결정하세요 하하. 🎜🎜rrreee🎜🎜🎜여기 contentre.findall()을 통해 반환되는 목록입니다. 🎜🎜🎜이제 보고싶은 개그는 성공적으로 얻었습니다! 로컬로 다운로드하고 싶다면 어떻게 해야 합니까? 🎜🎜3. 농담을 로컬로 다운로드합니다. 🎜🎜save() 함수를 정의하면 num 매개변수가 사용자 정의되어 콘텐츠를 다운로드하는 데 문제가 없습니다. 마지막 100페이지 중! 언급되지 않은 변수도 있으며, 소스코드는 마지막에 공개하겠습니다. 🎜🎜rrreee🎜🎜로컬 문서로 다운로드 후 아래와 같이🎜🎜초보자를 위한 Python 크롤러: 크롤링 농담🎜 🎜4. 농담을 하나씩 읽어보세요 🎜🎜 농담이 너무 많고 눈부신 배열이 있습니다. 하지만 우리는 그것들을 하나씩 읽고 싶습니다. 키보드의 아무 키나 눌러 다음 항목으로 전환할 수 있으며, 마지막 항목을 읽을 때까지 프로그램이 종료되지 않거나 ​​설정 등 종료 키를 설정하여 언제든지 프로그램을 종료할 수 있습니다. q 키를 눌러 종료하세요. 🎜전체 코드는 여기에 제공됩니다. 🎜🎜🎜rrreee🎜🎜 시연해보시면 효과는 이렇습니다. 🎜🎜🎜🎜🎜기능이 매우 쓸모가 없지만 초보자로서 여전히 매우 만족합니다. 관심이 있어야만 더 깊이 들어갈 수 있습니다! 크롤러는 그것뿐만 아니라 앞으로 더 고급 기능을 배우게 될 것입니다. 🎜🎜🎜🎜by @sunhaiyu🎜🎜2016.8.15🎜

위 내용은 초보자를 위한 Python 크롤러: 크롤링 농담의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.