版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36092584/article/details/81252674
前面用的一直是Python内置的urllib库进行爬虫实验,后面发现原来用第三方库requests更佳
下面这个是对糗事百科的段子爬取,代码更加规范,符合面向对象,而且特别是requests用起来更方便
在windows系统下只需要在命令行输入命令 pip install requests 即可安装。
# coding:utf-8
import re
import requests
class JOKE:
# 魔法方法
def __init__(self):
self.user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
self.header = {'User-Agent' : self.user_agent}
def getPage(self):
try:
url = 'http://www.qiushibaike.com/hot/page/1'
response = requests.get(url, headers = self.header, timeout = 30)
pattern = re.compile('<div class="content">\s<span>(.*?)</span>.*?<div class="stats"', re.S)
items = re.findall(pattern, response.text)
if len(items) == 0:
print("未抓取到数据!!!")
#saveContent(response.text)
for item in items:
br = re.compile('<br/>')
text = re.sub(br, '\n', item)
print(text)
except:
return "产生异常"
if __name__ == '__main__':
joke = JOKE()
joke.getPage()
代码说明:
多行匹配,那么需要加上re.S
str = "a23b\na34b"
re.findall(r"a(\d+)b.+a(\d+)b", str)#输出[]
#因为不能处理str中间有\n换行的情况
re.findall(r"a(\d+)b.+a(\d+)b", str, re.S)#s输出[('23', '34')]
贪婪和非贪婪匹配
str = "a123b456b"
print re.findall(r"a(.+?)b", str)#输出['123']#?控制只匹配0或1个,所以只会输出和最近的b之间的匹配情况
print re.findall(r"a(.+)b", str)#输出['123b456']
print re.findall(r"a(.*)b", str)#输出['123b456']