在爬取了糗事百科的段子之后,我发现还挺好玩的。接着想还有什么是好玩的呢?因为平时也喜欢看电影,就进入豆瓣电影的官网,看到豆瓣电影TOP250的页面。哎,把这个榜单爬下来应该挺好玩的吧。话不多说,马上行动。
这里用的还是最基础的urllib库和re库,通过正则表达式匹配需要的内容,当然,之后还会有更加高级的方法,但是多写简单的可以提高对原理的认识。简单总结一下python爬虫爬取简单静态网页的一般步骤:
1.打开待爬取的网页右键查看源代码,通常我们想要获取的信息都在指定的标签下,通过观察,找出规律。
2.用正则表达式表达这种规律。
3.添加代码根据正则表达式爬取相应内容,并输出在控制台/保存到文件/保存到数据库。
由于该Demo在整体上和上个爬取糗事百科的Demo类似,因此有的代码细节不赘述。
首先,看一下豆瓣电影TOP250的网页第一页源代码:
该Demo仅仅获取电影的名称和排名,可以看到<em class="">1</em>中的1就是排名,而<span class="title">肖申克的救赎</span>就是名称。因此设计正则表达式的模式为pattern = '<li>.*?<em class="">(.*?)</em>.*?<span class="title">(.*?)</span>.*?</li>'(如果发现输出结果和预期的不同,大概率是模式设计的不好,最好检查一下。)
TOP250有10页,每页放了25部电影,而观察每一页的url,会发现一个规律:
第一页的URL:
第三页的URL:
发现除了start=x外,其余都相同,而且第一页x=0,第三页x=50,........,第10页x=225。因此构造待爬取的URL为:
url = 'https://movie.douban.com/top250'
for i in range(0, 250, 25):
des_url = url + '?start=' + str(i) + '&filter='拿到了URL,就可以进行分析和爬取了,直接上代码:
# 获取URL内容的函数
def getURLText(url):
try:
request = urllib.request.Request(url, headers = headers)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
return content
except Exception as e:
print(e)
getURLText(url)函数根据传入的url获取网页信息并返回
# 对得到的内容进行解析,写入
def doContent(path, content):
pattern = re.compile('<li>.*?<em class="">(.*?)</em>.*?<span class="title">(.*?)</span>.*?</li>', re.S)
items = re.findall(pattern, content)
for item in items:
f = open(path, 'a')
# 格式化写入字符,%-10s表示在字符串后面添加占位符,文本左对齐
f.write('%-10s%-10s' % (item[0], item[1]))
f.write('\n')
f.close()
这里获取网页信息并保存在文件中。以下是完整代码:
import re
import urllib.request
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = {'User-Agent': user_agent}
# 获取URL内容的函数
def getURLText(url):
try:
request = urllib.request.Request(url, headers = headers)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
return content
except Exception as e:
print(e)
# 对得到的内容进行解析,写入
def doContent(path, content):
pattern = re.compile('<li>.*?<em class="">(.*?)</em>.*?<span class="title">(.*?)</span>.*?</li>', re.S)
items = re.findall(pattern, content)
for item in items:
f = open(path, 'a')
# 格式化写入字符,%-10s表示在字符串后面添加占位符,文本左对齐
f.write('%-10s%-10s' % (item[0], item[1]))
f.write('\n')
f.close()
# 主函数
def main():
url = 'https://movie.douban.com/top250'
path = 'C:/Users/Administrator/Desktop/doubanMovieTop250.txt'
for i in range(0, 250, 25):
des_url = url + '?start=' + str(i) + '&filter='
content = getURLText(des_url)
items = doContent(path, content)
main()执行结果:
漂亮~看到自己写的代码跑出想要的结果才是最开心的啦,之后可以发挥想象力,爬出更有趣的内容。
加油!
1万+

被折叠的 条评论
为什么被折叠?



