爬取豆瓣TOP250电影的评分、评价人数、短评等信息,并在其保存在sql数据库中。

爬取目标
爬取豆瓣TOP250电影的评分、评价人数、短评等信息,并在其保存在sql数据库中。

最终实现效果如图:
这里写图片描述

确定爬取的URL
爬取的网页地址为:https://movie.douban.com/top250

打开网页后,可观察到:TOP250的电影被分成了10个页面来展示,每个页面有25个电影。

那么要爬取所有电影的信息,就需要知道另外9个页面的URL链接。

观察发现:
第2个页面的URL链接为:

引用块内容

第三个页面的URL链接为:
这里写图片描述

第4个URL链接为:
这里写图片描述

剩余的以此类推。

因此,出了第一个页面的链接是:https://movie.douban.com/top250外,其他页面的链接都是由相同的规律的。

观察网页源代码规律
以https://movie.douban.com/top250为例
这里写图片描述

python实现:

!/usr/bin/env python
--coding: utf-8--
import requests
from lxml import etree
import MySQLdb

# 使用requests方法后,会返回一个response对象,其存储了服务器响应的内容,如上实例中已经提到的 r.text、r.status_code……
#Python 标准库中自带了 xml 模块,但是性能不够好,而且缺乏一些人性化的 API,相比之下,第三方库 lxml 是用 Cython 实现的,
# 而且增加了很多实用的功能,可谓爬虫处理网页数据的一件利器。lxml 大部分功能都存在
#lxml 还支持几个函数 find/findall,他们使用 ElementPath,是一种类似 xpath 的语言
#安装命令
#pip install requests
#pip install lxml,pip2~~~~~

def get_url(url):
url=url
headers={
‘User-Agent’:‘Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36’}
#user-Agent是浏览器标识的意思,如果您ua设为无,网页会认为是一个未知设备在请求访问,
html=requests.get(url,headers=headers) # 将源码转化为能被XPath匹配的格式
selector=etree.HTML(html.text)

这里使用//从全文中定位符合条件的a标签,使用“@标签属性”获取a标签的href属性值

hrefs=selector.xpath(‘//[@id=“content”]/div/div[1]/div[2]/a/@href’)
hrefs.insert(0, ‘’)
for href in hrefs:
string=url+href
print(string+“\n”)
j = [0];j[0] += 2
def get_string(string):
headers={
‘User-Agent’:‘Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36’}
html=requests.get(string,headers=headers)
selector=etree.HTML(html.text)

XPATH基本上是用一种类似目录树的方法来描述在XML文档中的路径。比如用“ / ”来作为上下层级间的分隔。第一个“ / ”表示文档的根节点(注意,不是指文档最外层的tag节点,而是指文档本身)。

       # 比如对于一个HTML文件来说,最外层的节点应该是 "/html"。

names=selector.xpath(‘//[@id=“content”]/div/div[1]/ol/li/div/div[2]/div[1]/a/span[1]/text()‘)
others=selector.xpath(’//
[@id=“content”]/div/div[1]/ol/li/div/div[2]/div[2]/p[1]/text()’)
nums=selector.xpath(‘//[@id=“content”]/div/div[1]/ol/li/div/div[2]/div[2]/div/span[2]/text()‘)
evaluates=selector.xpath(’//
[@id=“content”]/div/div[1]/ol/li/div/div[2]/div[2]/div/span[4]/text()’)
briefs=selector.xpath(‘//[@id=“content”]/div/div[1]/ol/li/div/div[2]/div[2]/p[2]/span/text()')
while j[0] <= 25:
temp = selector.xpath(
'//
[@id=“content”]/div/div[1]/ol/li[’ + str(j[0]) + ‘]/div/div[2]/div[2]/p[2]/span/text()’)
if len(temp) == 0:
temp = ‘null’ # 因为某些电影没有brief,如247,所以用N来代替,
for h in temp:
briefs.insert(j[0], h)
j[0] += 1
# 以上七行代码处理有些没有brief的情况
for name,other,num,evaluate,brief in zip(names,others,nums,evaluates,briefs):
#print(name)
#print(other)
# print(num)
#print(evaluate)
#print(brief)
#以下是插入数据库的代码
db = MySQLdb.connect(“localhost”, “root”, “1234”, “dh”, charset=“utf8”)
cursor = db.cursor() #获得python执行Mysql命令的方法,操作游标
sql = “insert into douban (name,other,num,evaluate,brief) values (‘%s’,‘%s’,‘%s’,‘%s’,‘%s’)” % (name, other, num, evaluate,brief.replace(‘’‘,’‘))
#在抓第120个电影时,出错,出现特殊字符,解决方法replace(’‘’,‘’)
cursor.execute(sql)
db.commit()
db.close()
#以上是插入数据库的代码
get_string(string)
get_url(‘https://movie.douban.com/top250’)

for循环的zip使用:例如,有两个列表:

a = [1,2,3]

b = [4,5,6]

使用zip()函数来可以把列表合并,并创建一个元组对的列表。

zip(a,b)

[(1, 4), (2, 5), (3, 6)]

格式看下面的图片
注意:
添加输出查看url是否全部在
这里写图片描述
这里写图片描述
所以添加一个代码
这里写图片描述
测试
这里写图片描述

再实现之前请安装python,mysql,详情查看百度
如果没有mysql,可以将
for name,other,num,evaluate,brief in zip(names,others,nums,evaluates,briefs): 下面的print(name)等一些元素解开注释,再注释关于插入数据库的代码

以上代码格式要求严格
这里写图片描述
这里写图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liuhm~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值