本文共 5821 字,大约阅读时间需要 19 分钟。
爬虫实例二:requests库+xpath爬取和保存豆瓣电影top250电影数据
import requestsfrom requests.exceptions import RequestExceptionimport parselimport csv
XPath 是一门在 XML 文档中查找信息的语言。XPath 用于在 XML 文档中通过元素和属性进行导航。因为本次我们是用xpth解析,所以import parsel。
浏览器代理,代码请求地址数据(携带用户代理)将代码伪装成浏览器,这样才会给我们返回数据。
定义请求一个网页的requests。def get_one_page(url): try: #分析网页、发送请求、浏览器代理 headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36'} #代码请求地址数据(携带用户代理)将代码伪装成浏览器 response = requests.get(url,headers = headers) response.encoding = 'utf-8' if response.status_code == 200: return response.text return None except RequestException: return None
官方文档https://docs.python-requests.org/,可以去捕捉在网页请求时的异常;当然你也可以去定义其他的异常捕捉。
定义解析网页的函数:def parsel_page(html): #xpath解析数据 、将数据转换成一个对象 selector = parsel.Selector(html) #如前面分析的一样,电影信息都在这个类ol[@class="grid_view"]中的/li标签里面 ls = selector.xpath('//ol[@class="grid_view"]/li') ls_mov = [] #定义空列表来存储电影信息 for li in ls: #电影名字 title = li.xpath('.//div[@class="hd"]/a/span[1]/text()').get() #导演主演 dirs = li.xpath('.//div[@class="bd"]/p[1]/text()').get().strip() #评分 star = li.xpath('.//div[@class="star"]/span[2]/text()').get().strip() #评论人数 com = li.xpath('.//div[@class="star"]/span[4]/text()').get().strip() #简介 quote = li.xpath('.//div[@class="bd"]/p[2]/span[1]/text()').get().strip() ls_mov.append([title,dirs,star,com,quote]) return ls_mov
以电影名字为例;
电影肖申克的救赎是在第一个<li标签<div标签中的class="hd"类中的<a标签的第一个标签中。text()方法是获得标签中的文字。 我们再来分析一下评分; 评分同样是在div[@class=“star”]/span[2](div标签中的star类里面的第二个span标签)中;第四个span标签里则是评论人数。使用strip()方法可以去掉字符串前后的空格。import requestsfrom requests.exceptions import RequestExceptionimport parseldef get_one_page(url): try: #分析网页、发送请求、浏览器代理 headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36'} #代码请求地址数据(携带用户代理)将代码伪装成浏览器 response = requests.get(url,headers = headers) response.encoding = 'utf-8' if response.status_code == 200: return response.text return None except RequestException: return Nonedef parsel_page(html): selector = parsel.Selector(html) ls = selector.xpath('//ol[@class="grid_view"]/li') ls_mov = [] for li in ls: title = li.xpath('.//div[@class="hd"]/a/span[1]/text()').get() dirs = li.xpath('.//div[@class="bd"]/p[1]/text()').get().strip() star = li.xpath('.//div[@class="star"]/span[2]/text()').get().strip() com = li.xpath('.//div[@class="star"]/span[4]/text()').get().strip() quote = li.xpath('.//div[@class="bd"]/p[2]/span[1]/text()').get().strip() ls_mov.append([title,dirs,star,com,quote]) return ls_mov def main(): url = 'https://movie.douban.com/top250?' html = get_one_page(url) ls = parsel_page(html) print(ls) if __name__ == '__main__': main() print("successful")
url = 'https://movie.douban.com/top250?'##url1=https://movie.douban.com/top250?start=0&filter=url2=https://movie.douban.com/top250?start=25&filter=url3=https://movie.douban.com/top250?start=50&filter=url4=https://movie.douban.com/top250?start=75&filter=
所以只需要改变start的页码值就可以获得另一个页面的URL,而且值得改变是有规律的,每次增加25.
修改main()函数,进行循环爬取,并且保存。def main(): for page in range(0,256,25): url = 'https://movie.douban.com/top250?start={page}&filter=' html = get_one_page(url) ls = parsel_page(html) #保存数据 for item in ls: with open ('movs.csv',mode='a',encoding='utf-8',newline='') as f: csv_write = csv.writer(f) csv_write.writerow(item)#分行写入
在代码保存的路径里生成一个CSV文件,可以用Excel打开;打开之后可以看到我们爬取到的数据。
完整代码:import requestsfrom requests.exceptions import RequestExceptionimport parselimport csvdef get_one_page(url): try: #分析网页、发送请求、浏览器代理 headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36'} #代码请求地址数据(携带用户代理)将代码伪装成浏览器 response = requests.get(url,headers = headers) response.encoding = 'utf-8' if response.status_code == 200: return response.text return None except RequestException: return None#解析网页def parsel_page(html): selector = parsel.Selector(html) ls = selector.xpath('//ol[@class="grid_view"]/li') ls_mov = [] for li in ls: #电影名字 title = li.xpath('.//div[@class="hd"]/a/span[1]/text()').get() #导演主演 dirs = li.xpath('.//div[@class="bd"]/p[1]/text()').get().strip() #评分 star = li.xpath('.//div[@class="star"]/span[2]/text()').get().strip() #评论 com = li.xpath('.//div[@class="star"]/span[4]/text()').get().strip() #简介 quote = li.xpath('.//div[@class="bd"]/p[2]/span[1]/text()').get().strip() ls_mov.append([title,dirs,star,com,quote]) return ls_mov def main(): for page in range(0,256,25): url = 'https://movie.douban.com/top250?start={page}&filter=' html = get_one_page(url) ls = parsel_page(html) #print(parsel_page(html)) #保存数据 for item in ls: with open ('movs.csv',mode='a',encoding='utf-8',newline='') as f: csv_write = csv.writer(f) csv_write.writerow(item) if __name__ == '__main__': main()
当然我们也可以用代码打开,这样就可以用来进行数据分析了。大家可以试试用我前面文章的pyecharts库,来进行一次数据分析。
转载地址:http://uqoxi.baihongyu.com/