豆瓣电影排行榜前 250 分为 10 页, 第一页的 url 为 https://movie.douban.com/top250, 但实际上应该是 https://movie.douban.com/top250?start=0 后面的参数 0 表示从第几个开始, 如 0 表示从第一 (肖申克的救赎) 到第二十五 (触不可及),https://movie.douban.com/top250?start=25 表示从第二十六(蝙蝠侠: 黑暗骑士) 到第五十名(死亡诗社). 等等,
所以可以用一个步长为 25 的 range 的 for 循环参数
- for i in range(0, 250, 25):
- print(i)
分析完页面组成后, 开始获取页面, 直接 request.get()发现没有返回任何东西, 输出一下响应码
- url = 'https://movie.douban.com/top250?start=0'
- res = request.get(url=url)
- print(res.status_code)
发现返回响应码 418
以前没见过这个, 拉网线上网查一下, 发现给 get 里面加一个 header 参数就行了
这里可以用自己浏览器的 user-agent, 如
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ApplewebKit/537.36 (Khtml, like Gecko) Chrome/73.0.3683.103 Safari/537.36'}
或者用 fake_agent(安装直接用 pip install fake_agent) 来为自己生成一个随机的 agent 添加到 header 字典中
- from fake_useragent import UserAgent
- headers = {
- 'User-Agent': UserAgent().random
- }
之后就可以得到页面源码了.
然后使用 lxml.etree, 即 xpath 解析页面源码. 用浏览器插件 xpath finder 快速定位到元素
- import requests
- import lxml.etree as etree
- url = 'https://movie.douban.com/top250?start=0'
- headers = {
- 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
- }
- res = requests.get(url=url, headers=headers)
- print(res.text)
- HTML = etree.HTML(res.text)
- name = HTML.xpath("/html/body/div[3]/div[1]/div/div[1]/ol/li[1]/div/div[2]/div[1]/a/span[1]")
- print(name)
但是直接这样子, 解析到的是这样的结果
[<Element span at 0x20b2f0cc488>]
关于这东西是什么, 有文章写的很好: https://www.jb51.net/article/132145.htm
这里我直接写解决部分, 在使用 xpath 解析时, 后面加上 / text()
name = HTML.xpath("/html/body/div[3]/div[1]/div/div[1]/ol/li[1]/div/div[2]/div[1]/a/span[1]/text()")
解决后, 再使用 xpath finder 插件, 一步一步获取到电影所有数据
最后把这个写在函数里, 外面再套上一开始说的循环, 就 OK 了
- # -*- coding: utf-8 -*-
- import requests
- import lxml.etree as etree
- def get_source(page):
- url = 'https://movie.douban.com/top250?start={}'.format(page)
- headers = {
- 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'}
- print(url)
- res = requests.get(url=url, headers=headers)
- print(res.status_code)
- HTML = etree.HTML(res.text)
- for i in range(1, 26):
- name = HTML.xpath("/html/body/div[3]/div[1]/div/div[1]/ol/li[{}]/div/div[2]/div[1]/a/span[1]/text()".format(i))
- info = HTML.xpath("/html/body/div[3]/div[1]/div/div[1]/ol/li[{}]/div/div[2]/div[2]/p[1]/text()".format(i))
- score = HTML.xpath(
- "/html/body/div[3]/div[1]/div/div[1]/ol/li[{}]/div/div[2]/div[2]/div/span[2]/text()".format(i))
- slogan = HTML.xpath(
- "/html/body/div[3]/div[1]/div/div[1]/ol/li[{}]/div/div[2]/div[2]/p[2]/span/text()".format(i))
- print(name[0])
- print(info[0].replace('',''))
- print(info[1].replace('',''))
- print(score[0])
- print(slogan[0])
- n = 1
- for i in range(0, 250, 25):
- print('第 %d 页' % n)
- n += 1
- get_source(i)
- print('==========================================')
Excel 操作不来. 淦. 鸽了
来源: http://www.bubuko.com/infodetail-3611005.html