爬虫实践01 | xpath爬取豆瓣top250电影排行榜

完整源代码:

#2022-03-01 xpath爬取豆瓣top250电影排行榜
import requests
from lxml import etree
import time
for a in range(10): 
    headers={'User-Agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'}
     #1、指定url
    url='https://movie.douban.com/top250?start={}&filter='.format(a*25)
    #2、发起请求 请求对应的url是携带参数的,并且请求过程中处理了参数
    response = requests.get(url=url,headers=headers)
    #     print(response.text)
    html=etree.HTML(response.text)
    divs=html.xpath('//*[@id="content"]/div/div[1]/ol/li')#这个属性里面有双引号,外面就用单引号
    #print(divs)
    #拿到每一个div
    for div in divs:
        title=div.xpath('./div/div[2]/div[1]/a/span[1]/text()') [0]#标题  打印出来是一个列表,我们要访问列表里的元素,只有一个元素,所以要加一个[0]
        year=div.xpath('./div/div[2]/div[2]/div/span[2]/text()')[0]#年份
        pj=div.xpath('./div/div[2]/div[2]/div/span[4]/text()')[0]#评价
        href=div.xpath('./div/div[2]/div[1]/a/@href')[0]#链接
        print(title,year,pj,href)
        time.sleep(3)
        with open(r"dbmovie.txt","a",encoding="utf-8") as f: #使用with open()新建对象f ,a 表示追加
            f.write("{},{},{},{}".format(title,year,pj,href))#将列表中的数据循环写入到文本文件中
            f.write("\n")

分析:

1、访问网站信息

url=“https://movie.douban.com/top250

import requests
from lxml import etree
headers={'User-Agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'}
 #1、指定url
url='https://movie.douban.com/top250'
#2、发起请求 请求对应的url是携带参数的,并且请求过程中处理了参数
response = requests.get(url=url,headers=headers)
print(response.text)

2、解析数据,拿到所有div标签

import requests
from lxml import etree
headers={'User-Agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'}
 #1、指定url
url='https://movie.douban.com/top250'
#2、发起请求 请求对应的url是携带参数的,并且请求过程中处理了参数
response = requests.get(url=url,headers=headers)
#     print(response.text)
html=etree.HTML(response.text)
divs=html.xpath('//*[@id="content"]/div/div[1]/ol/li')#这个属性里面有双引号,外面就用单引号
print(divs)

copy得到的xpath是://*[@id="content"]/div/div[1]/ol/li[1]这个是一个div,要所有的div:

就改成://*[@id="content"]/div/div[1]/ol/li,去掉[1]

3、找到单个div,并查找所有需要的字段

import requests
from lxml import etree
import time
headers={'User-Agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'}
 #1、指定url
url='https://movie.douban.com/top250'
#2、发起请求 请求对应的url是携带参数的,并且请求过程中处理了参数
response = requests.get(url=url,headers=headers)
#     print(response.text)
html=etree.HTML(response.text)
divs=html.xpath('//*[@id="content"]/div/div[1]/ol/li')#这个属性里面有双引号,外面就用单引号
#print(divs)
#拿到每一个div
for div in divs:
    title=div.xpath('./div/div[2]/div[1]/a/span[1]/text()') [0]#标题  打印出来是一个列表,我们要访问列表里的元素,只有一个元素,所以要加一个[0]
    year=div.xpath('./div/div[2]/div[2]/div/span[2]/text()')[0]#年份
    pj=div.xpath('./div/div[2]/div[2]/div/span[4]/text()')[0]#评价
    href=div.xpath('./div/div[2]/div[1]/a/@href')[0]#链接
    print(title,year,pj,href)
    time.sleep(3)
    with open(r"dbmovie11.txt","a",encoding="utf-8") as f:
        f.write("{},{},{}".format(title,year,pj,href))
        f.write("\n")

其他字段也是一样的方法:点击按钮,在网页中点击你想查找的部分,在Elements对应代码中点击右键,Copy->Copy Xpath,

4、保存数据

import requests
from lxml import etree
import time
for a in range(10): 
    headers={'User-Agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'}
     #1、指定url
    url='https://movie.douban.com/top250?start={}&filter='.format(a*25)
    #2、发起请求 请求对应的url是携带参数的,并且请求过程中处理了参数
    response = requests.get(url=url,headers=headers)
    #     print(response.text)
    html=etree.HTML(response.text)
    divs=html.xpath('//*[@id="content"]/div/div[1]/ol/li')#这个属性里面有双引号,外面就用单引号
    #print(divs)
    #拿到每一个div
    for div in divs:
        title=div.xpath('./div/div[2]/div[1]/a/span[1]/text()') [0]#标题  打印出来是一个列表,我们要访问列表里的元素,只有一个元素,所以要加一个[0]
        year=div.xpath('./div/div[2]/div[2]/div/span[2]/text()')[0]#年份
        pj=div.xpath('./div/div[2]/div[2]/div/span[4]/text()')[0]#评价
        href=div.xpath('./div/div[2]/div[1]/a/@href')[0]#链接
        print(title,year,pj,href)
        time.sleep(3)
        with open(r"dbmovie.txt","a",encoding="utf-8") as f: #使用with open()新建对象f ,a 表示追加
            f.write("{},{},{},{}".format(title,year,pj,href))#将列表中的数据循环写入到文本文件中
            f.write("\n")

 

 1、分析网站url可得到,25条数据为一页,一共10页,所以用for循环来保存每一页数据:

url='https://movie.douban.com/top250?start={}&filter='.format(a*25)

2、用with open来打开一个对象文件

5、爬取完成

注意:

1、这种最简单的访问方式,很容易导致ip被封,请谨慎执行!

(执行3-5次,好像没啥问题,执行多了,就封了。。。)

2、可以尝试使用selenium方式来访问

 

 

posted @ 2022-03-01 21:37  优秀的进度条  阅读(958)  评论(0编辑  收藏  举报