源代码:
#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循环来保存每一页数据: 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方式来访问