源代码:

  1. #2022-03-01 xpath爬取豆瓣top250电影排行榜
  2. import requests
  3. from lxml import etree
  4. import time
  5. for a in range(10):
  6. 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'}
  7. #1、指定url
  8. url='https://movie.douban.com/top250?start={}&filter='.format(a*25)
  9. #2、发起请求 请求对应的url是携带参数的,并且请求过程中处理了参数
  10. response = requests.get(url=url,headers=headers)
  11. # print(response.text)
  12. html=etree.HTML(response.text)
  13. divs=html.xpath('//*[@id="content"]/div/div[1]/ol/li')#这个属性里面有双引号,外面就用单引号
  14. #print(divs)
  15. #拿到每一个div
  16. for div in divs:
  17. title=div.xpath('./div/div[2]/div[1]/a/span[1]/text()') [0]#标题 打印出来是一个列表,我们要访问列表里的元素,只有一个元素,所以要加一个[0]
  18. year=div.xpath('./div/div[2]/div[2]/div/span[2]/text()')[0]#年份
  19. pj=div.xpath('./div/div[2]/div[2]/div/span[4]/text()')[0]#评价
  20. href=div.xpath('./div/div[2]/div[1]/a/@href')[0]#链接
  21. print(title,year,pj,href)
  22. time.sleep(3)
  23. with open(r"dbmovie.txt","a",encoding="utf-8") as f: #使用with open()新建对象f ,a 表示追加
  24. f.write("{},{},{},{}".format(title,year,pj,href))#将列表中的数据循环写入到文本文件中
  25. f.write("\n")

分析:

1、访问网站信息

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

  1. import requests
  2. from lxml import etree
  3. 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'}
  4. #1、指定url
  5. url='https://movie.douban.com/top250'
  6. #2、发起请求 请求对应的url是携带参数的,并且请求过程中处理了参数
  7. response = requests.get(url=url,headers=headers)
  8. print(response.text)

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

  1. import requests
  2. from lxml import etree
  3. 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'}
  4. #1、指定url
  5. url='https://movie.douban.com/top250'
  6. #2、发起请求 请求对应的url是携带参数的,并且请求过程中处理了参数
  7. response = requests.get(url=url,headers=headers)
  8. # print(response.text)
  9. html=etree.HTML(response.text)
  10. divs=html.xpath('//*[@id="content"]/div/div[1]/ol/li')#这个属性里面有双引号,外面就用单引号
  11. print(divs)

image.png

copy得到的xpath是://[@id=”content”]/div/div[1]/ol/li[1]这个是一个div,要所有的div:就是改成: //[@id=”content”]/div/div[1]/ol/li,去掉[1]

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

  1. import requests
  2. from lxml import etree
  3. import time
  4. 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'}
  5. #1、指定url
  6. url='https://movie.douban.com/top250'
  7. #2、发起请求 请求对应的url是携带参数的,并且请求过程中处理了参数
  8. response = requests.get(url=url,headers=headers)
  9. # print(response.text)
  10. html=etree.HTML(response.text)
  11. divs=html.xpath('//*[@id="content"]/div/div[1]/ol/li')#这个属性里面有双引号,外面就用单引号
  12. #print(divs)
  13. #拿到每一个div
  14. for div in divs:
  15. title=div.xpath('./div/div[2]/div[1]/a/span[1]/text()') [0]#标题 打印出来是一个列表,我们要访问列表里的元素,只有一个元素,所以要加一个[0]
  16. year=div.xpath('./div/div[2]/div[2]/div/span[2]/text()')[0]#年份
  17. pj=div.xpath('./div/div[2]/div[2]/div/span[4]/text()')[0]#评价
  18. href=div.xpath('./div/div[2]/div[1]/a/@href')[0]#链接
  19. print(title,year,pj,href)
  20. time.sleep(3)
  21. with open(r"dbmovie11.txt","a",encoding="utf-8") as f:
  22. f.write("{},{},{}".format(title,year,pj,href))
  23. f.write("\n")

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

4、保存数据

  1. import requests
  2. from lxml import etree
  3. import time
  4. for a in range(10):
  5. 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'}
  6. #1、指定url
  7. url='https://movie.douban.com/top250?start={}&filter='.format(a*25)
  8. #2、发起请求 请求对应的url是携带参数的,并且请求过程中处理了参数
  9. response = requests.get(url=url,headers=headers)
  10. # print(response.text)
  11. html=etree.HTML(response.text)
  12. divs=html.xpath('//*[@id="content"]/div/div[1]/ol/li')#这个属性里面有双引号,外面就用单引号
  13. #print(divs)
  14. #拿到每一个div
  15. for div in divs:
  16. title=div.xpath('./div/div[2]/div[1]/a/span[1]/text()') [0]#标题 打印出来是一个列表,我们要访问列表里的元素,只有一个元素,所以要加一个[0]
  17. year=div.xpath('./div/div[2]/div[2]/div/span[2]/text()')[0]#年份
  18. pj=div.xpath('./div/div[2]/div[2]/div/span[4]/text()')[0]#评价
  19. href=div.xpath('./div/div[2]/div[1]/a/@href')[0]#链接
  20. print(title,year,pj,href)
  21. time.sleep(3)
  22. with open(r"dbmovie.txt","a",encoding="utf-8") as f: #使用with open()新建对象f ,a 表示追加
  23. f.write("{},{},{},{}".format(title,year,pj,href))#将列表中的数据循环写入到文本文件中
  24. f.write("\n")

image.png
image.png
image.png
image.png

1、分析网站url可得到,25条数据为一页,一共10页,所以用for循环来保存每一页数据: for i in range(10):#一共有10页 url=’https://movie.douban.com/top250?start={}&filter=’.format(a*25)) 2、用with open来打开一个对象文件

5、爬取完成

注意:
1、这种最简单的访问方式,很容易导致ip被封,请谨慎执行!
(执行3-5次,好像没啥问题,执行多了,就封了。。。)
2、可以尝试使用selenium方式来访问